重新教自己学算法之开篇(一)
来源:互联网 发布:sql oracle 去重复 编辑:程序博客网 时间:2024/06/02 14:46
目前在读大三,面临找工作。经同学面试笔试经验得知,多以算法为主。而自我感觉算法仍然欠缺,打算重新学一遍经常用的算法。因此根据csdn博主feixiaoxing的文章一步一步学习,并坚持每天至少一篇文章,在文章中尽量加入自己的代码和注解,希望能尽快完成算法的回顾。
今天是有关一个数组的查找,比较简单。代码和注解如下:
#include <iostream>#include <cassert>using namespace std;int find(int array[], int length, int value){ if(NULL == array || 0 == length) return false; //用下标实现查找 /*int index = 0; for(;index < length; index++){ if(value == array[index]) return index; }*/ //用指针实现查找,进行优化 int *start = array; int *end = array + length; while(start < end){ if(value == *start) return start - array; start++; } return false;}//参数是通用的数据类型template<typename type>int find_2(type array[], int length, type value){ if(NULL == array || 0 == length){ return false; } type *start = array; type *end = array + length; while(start < end){ if(value == *start) return start - array; start++; } return false;}static void test(){ int array[10] = {1,2}; assert(0 == find(array,10,1)); assert(false == find(array,10,10));}static void test1(){ int array[10] = {0}; assert(false == find_2<int>(NULL,10,10)); assert(false == find_2<int>(array,0,10));}static void test2(){ int array[10] = {1,2}; assert(0 == find_2<int>(array,10,1)); assert(false == find_2<int>(array,0,10));}int main(int argc, char const *argv[]){ test(); test1(); test2(); return 0;}
(代码调试已通过)
总结:
1:知道了测试用例的重要性,没有测试用例保证的代码(尽量完备)只是一段无序的字符而已,没有什么价值。
2:一定要进行函数参数的合法性判断,见函数find();
3:assert函数:
#include<cassert>void assert(int expression);
作用:计算表达式experssion,如果其值为假(0),那么闲打印出一条出错信息,然后通过调用abort来终止程序运行。
4:代码中find()函数,为了对代码进行优化,将数组改为了指针。原因:数组的访问需要三步:获取基地址、偏移值、取值,而如果指针可以随index移动的话,那么数据的访问只需要取值这样一个步骤即可。
5:关注指针的运算是基础知识,一定要弄得懂。
6:代码中还用到template模板,可参见c++ primer 16章,模板与泛型编程。
6:算法都需要测试用例的验证,
任何优化都要建立在测试的基础之上,
测试和代码的编写要同步进行,
算法的成功运行时一步一步进行,每一步的成功都必须建立在前一步的基础之上。
0 0
- 重新教自己学算法之开篇(一)
- 重新教自己学算法之循环-递归(二)
- 重新教自己学算法之线性队列(七)
- 重新教自己学算法之线性堆栈(八)
- 重新教自己学算法之单词统计(状态机)(十)
- 重新教自己学算法之非递归排序——冒泡-插入-排序(三)
- 重新教自己学算法之递归排序——快速排序(四)
- 重新教自己学算法之递归排序——合并排序(五)
- 重新教自己学算法之递归排序——堆排序(六)
- 重新教自己学算法之单向链表(九)
- 重新教自己学算法之图的最短路(十二)
- 重新教自己学算法之图的遍历(十一)—深度(DFS)和广度(BFS)
- 二哥学算法之图(开篇)
- (一)、一步一步学GTK+之开篇
- (一)、一步一步学GTK+之开篇
- (一)、一步一步学GTK+之开篇
- 算法交作业之开篇(一)
- 转载: 循序渐进学Minifilter(微过滤器) 之 一 (开篇)
- 理解延迟(latency)和吞吐量(throghtput)
- POJ 1426 Find The Multiple(bfs+打表)
- 上传文件
- Ubuntn下搭建L2TP
- 用GDB调试程序
- 重新教自己学算法之开篇(一)
- hdu 2020 绝对值排序 (java)
- msvcp100d.dll没有被指定在Windows上运行
- 三维几何之判断俩个一个六面题的重心稳定性
- linux 命令之 hostname
- c语言,求数组大小
- Google JavaScript 编码规范指南
- Redis常用命令
- Android学习心得(1) --- MAC下Android环境的搭建