【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】

算法是计算机的生命。没有算法,就没有软件,计算机也就成了一个冰冷的机器,没有什么实用价值。很多人认为,算法是数学的内容,学起来特别麻烦。我们不能认为这种观点是错误的。但是我们也知道,软件是一种复合的技术,如果一个人只知道算法,但是不能用编程语言很好地实现,那么再优秀的算法也不能发挥作用。一个人只有有了很好的计算机知识和数学知识,才能在算法的学习上不断进步。不管算法都么简单,都要自己亲手实践,只有不断认识错误、不断发现错误,才能不断提高自己的编程能力,不断提高自己的业务水平。

这里取名一步一步写算法的目的主要有两个:第一,保证我们的算法都是大家可以学得会,看的懂的;第二,保证我们的算法是健壮的、可以测试的。所以在编写的过程中,我们的算法开发过程是伴随着测试用例增加的,没有测试用例保证的代码只是一段无序的字符而已,没有什么价值。

其实任何算法都有自己的应用环境和应用场景,没有算法可以适用于所有的场景。这一点希望大家明白。同时,我们也要清楚复杂的算法都是由普通的算法构成的,没有普通的算法就没有复杂的算法可言,所以复杂变简单,由大化小,这就是算法分治递归的基本思想。

我们可以下面一个数组查找的函数说起。一句一句写起,首先我们开始从最简单的函数构造开始:

int find(int array[], int length, int value)
{
int index = 0;
return index;
}

这里看到,查找函数只是一个普通的函数,那么首先需要判断的就是参数的合法性:

static void test1()
{
int array[10] = {0};
assert(FALSE == find(NULL, 10, 10));
assert(FALSE == find(array, 0, 10));
}

这里可以看到,我们没有判断参数的合法性,那么原来的查找函数应该怎么修改呢?

int find(int array[], int length, int value)
{
if(NULL == array || 0 == length)
return FALSE;
int index = 0;
return index;
}

看到上面的代码,说明我们的已经对入口参数进行判断了。那么下面就要开始写代码了。

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;
}
return FALSE;
}

上面的代码已经接近完整了,那么测试用例又该怎么编写呢?

static void test2()
{
int array[10] = {1, 2};
assert(0 == find(array, 10, 1));
assert(FALSE == find(array, 10, 10));
}

运行完所有的测试用例后,我们看看对原来的代码有没有什么可以优化的地方。其实,我们可以把数组转变成指针。

int find(int array[], int length, int value)
{
if(NULL == array || 0 == length)
return FALSE;
int* start = array;
int* end = array + length;
while(start < end){
if(value == *start)
return ((int)start - (int)array)/(sizeof(int));
start ++;
}
return FALSE;
}

如果上面的代码参数必须是通用的数据类型呢?

template<typename type>
int find(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 ((int)start - (int)array)/(sizeof(type));
start ++;
}
return FALSE;
}

此时,测试用例是不是也需要重新修改呢?

static void test1()
{
int array[10] = {0};
assert(FALSE == find<int>(NULL, 10, 10));
assert(FALSE == find<int>(array, 0, 10));
}
static void test2()
{
int array[10] = {1, 2};
assert(0 == find<int>(array, 10, 1));
assert(FALSE == find<int>(array, 10, 10));
}

所以,下面我们总结一下:

(1)我们的算法需要测试用例的验证

(2)任何的优化都要建立在测试的基础之上

(3)测试和代码的编写要同步进行

(4)算法的成功运行时一步一步进行得,每一步的成功必须确立在原有的成功之上

【预告: 下一篇介绍循环和递归】

一步一步写算法(开篇)相关推荐

  1. 一步一步写算法(之图结构)

    原文:一步一步写算法(之图结构) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 图是数据结构里面的重要一章.通过图,我们可以判断两个点之间是 ...

  2. 一步一步写算法(之prim算法 中)

    原文:一步一步写算法(之prim算法 中) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] C)编写最小生成树,涉及创建.挑选和添加过程 MI ...

  3. 一步一步写算法(之寻找丢失的数)

    一步一步写算法(之寻找丢失的数) 原文:一步一步写算法(之寻找丢失的数) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 假设我们有一个1亿个 ...

  4. 一步一步写算法(之克鲁斯卡尔算法 中)

    一步一步写算法(之克鲁斯卡尔算法 中) 原文:一步一步写算法(之克鲁斯卡尔算法 中) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 前面说到 ...

  5. 一步一步写算法(之prim算法 下)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 前两篇博客我们讨论了prim最小生成树的算法,熟悉了基本的流程.基本上来说,我们是按照自上而下 ...

  6. 编程题C语言写牛牛数星星,一步一步写算法(之“数星星”)

    原文: 一步一步写算法(之"数星星") [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 学过编程的朋友都知道,当初为了学习 ...

  7. 一步一步写算法(之排序二叉树删除-1)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 相比较节点的添加,平衡二叉树的删除要复杂一些.因为在删除的过程中,你要考虑到不同的情况,针对每 ...

  8. 一步一步写算法(之排序二叉树删除-3)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 3 普通节点的删除 3.1 删除的节点没有左子树,也没有右子树 测试用例1: 删除节点6 /* ...

  9. 一步一步教你写股票走势图——K线图三(添加均线)

    目录 一步一步教你写股票走势图--分时图一(概述) 一步一步教你写股票走势图--分时图二(自定义xy轴) 一步一步教你写股票走势图--分时图三(对齐图表.自定义柱状图高亮) 一步一步教你写股票走势图- ...

最新文章

  1. 超详细教你10分钟搭建一个高端的B2B2C模式的综合性商城|含来客推V3源码下载
  2. ITK:观察过滤器Watch A Filter
  3. Asp.Net Core对接钉钉群机器人
  4. java使用教程——组件及事件处理——常用组件与布局
  5. 解决异步问题,教你如何写出优雅的promise和async/await,告别callback回调地狱!
  6. 文件的读操作 c# 1614526130
  7. 还争什么流量场景,罗振宇已经用时间挣钱了!
  8. 最受欢迎的网管工具集
  9. 概率论————思维导图(上岸必备)(一维随机变量及其分布)
  10. YYLabel的若干个疑问持续更新
  11. Android Studio实现用户登陆界面demo(xml实现)
  12. Linux服务器遇到攻击怎么办?用这些方法封禁IP
  13. oracle translate using,oracle translate() 详解
  14. MySQL当前读和快照读
  15. 输入某辆小轿车三次的 耗油量(升)和行驶里程(公里),计算平均油耗(升/百公里)。
  16. 计蒜客--蒜头君的新游戏
  17. 薅羊毛常见问题合集——更新中
  18. 你应该知道的requestIdleCallback
  19. 自适应控制——仿真实验二 用Narendra方案设计模型参考自适应系统
  20. CSS学习笔记(二十一)CSS变量var()

热门文章

  1. Linux 下的 sleep
  2. 单例模式Java的七种写法
  3. CentOS(RedHat)命令行永久修改IP地址、网关、DNS
  4. 建立网站的全套流程与详细解释(转载)
  5. json转换成dart类 JSON to Dart
  6. [USACO2011 Feb] Cow Line
  7. 12.敏捷估计与规划——Splitting User Stories笔记
  8. 数论基础之组合数计数问题
  9. JavaScript常见笔试题分析
  10. IOS Window窗口使用