重新教自己学算法之开篇(一)

来源:互联网 发布: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