引自:http://blog.csdn.net/feixiaoxing/article/details/6835423

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

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

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. 数据结构与算法学习笔记之 从0编号的数组

    数据结构与算法学习笔记之 从0编号的数组 前言 数组看似简单,但掌握精髓的却没有多少:他既是编程语言中的数据类型,又是最基础的数据结构: 一个小问题: 为什么数据要从0开始编号,而不是 从1开始呢? ...

  2. python leetcode_leetcode 介绍和 python 数据结构与算法学习资料

    for (刚入门的编程)的高中 or 大学生 leetcode 介绍 leetcode 可以说是 cs 最核心的一门"课程"了,虽然不是大学开设的,但基本上每一个现代的高水平的程序 ...

  3. 七桥问题c语言程序数据结构,数据结构与算法学习——图论

    什么是图? 在计算机程序设计中,图结构也是一种非常常见的数据结构 但是图论其实是一个非常大的话题 图结构是一种与树结构有些相似的数据结构 图论是数学的一个分支,并且在数学概念上,树是图的一种 它以图为 ...

  4. 数据结构与算法学习笔记之 提高读取性能的链表(上)

    数据结构与算法学习笔记之 提高读取性能的链表(上) 前言 链表(Linked list)比数组稍微复杂一点,在我们生活中用到最常见的应该是缓存,它是一种提高数据读取性能的技术,常见的如cpu缓存,浏览 ...

  5. 数据结构与算法学习笔记——链栈

    数据结构与算法学习笔记(C语言) 链栈 在开始链栈的学习之前,我们先实现一下上一篇文章中提到的检查括号匹配的小程序,鉴于水平有限,本人就随便写一下代码好了,目标仅限于对功能的实现. /*用顺序栈这种数 ...

  6. 数据结构与算法学习笔记4:递归+分治法

    数据结构与算法学习笔记4 递归 斐波那契数列 青蛙跳台阶问题 链表倒序打印 分治法 二分查找/折半查找 Binary Search 题目1:快速幂 题目2:如何判断一个数是否为2的次幂 递归 指在函数 ...

  7. 数据结构与算法学习⑤(BFS和DFS 贪心算法 二分查找)

    数据结构与算法学习⑤ 数据结构与算法学习⑤ 1.BFS和DFS 1.1.深度优先搜索算法 1.2.广度优先搜索算法 面试实战 102. 二叉树的层序遍历 104. 二叉树的最大深度 515. 在每个树 ...

  8. 完全背包问题贪心算法c语言,数据结构与算法学习之路:背包问题的贪心算法和动态规划算法...

    一.背包问题描述: 有N种物品和一个重量为M的背包,第i种物品的重量是w[i],价值是p[i].求解将哪些物品装入背包可使这些物品的费用总和不超过背包重量,且价值总和最大. 二.解决方法: 1.贪心算 ...

  9. LeetCode数据结构与算法学习Day03

    LeetCode数据结构与算法学习Day03 图解数据结构与算法 59 I 滑动窗口最大值 题目描述: 解题思路: 59 II 队列的最大值 题目描述: 解题思路: 67 把字符串转换成整数 题目描述 ...

  10. 数据结构与算法学习④(哈夫曼树 图 分治回溯和递归)

    数据结构与算法学习④(哈夫曼树 图 回溯和递归 数据结构与算法学习④ 1.哈夫曼树 1.1.相关概念 1.2.哈夫曼树的构建 1.3.哈夫曼编码 1.4.面试题 2.图 2.1.图的相关概念 2.2. ...

最新文章

  1. Camera HDR Algorithms
  2. 关于Android中的onCreate()多次被调用导致bindService被多次调用的问题...
  3. 二叉树的遍历:前序、中序、后序、层次遍历(仅例题)
  4. keras模型保存和加载
  5. Python3 中打的迭代器与生成器
  6. windows7下redis的安装实践
  7. 销傲销售过程GSP管理系统功能概述
  8. AEJoy —— 表达式之弹性震动模拟详解【JS】
  9. 【果壳笔记】生物信息学——陈小伟老师部分
  10. 如何更好的把平时的工作记录下来?这款便签可以高效记录工作日志
  11. 扰动分析 matlab,扰动材料力学有限元分析:基于MATLAB编程
  12. 3ds max 使用cloth修改器制作抱枕
  13. 个人网站学习实践(wordpress教程)
  14. IO_FILE hack FSOP
  15. MySQL常用类型转换函数总结
  16. 卖罐头(冬季每日一题 32)
  17. 在地址栏上输入一个url,到这个页面呈现出来,中间会发生什么?
  18. pycharm调试代码139错误的可能解决办法
  19. 汽车概论结业报告计算机系,无人驾驶汽车概论
  20. 万字长文!对比分析了多款存储方案,KeeWiDB最终选择自己来

热门文章

  1. 禁止服务器的协议,Windows 服务器禁用 SSL 2 和 SSL 3 协议
  2. python中x y表示_Python中表达式x += y和x = x+y 的区别详解
  3. 2021年春季学期-信号与系统-第四次作业参考答案-第七小题
  4. 第十六届全国大学生智能汽车竞赛 英飞凌特供芯片支持计划TC364TC377
  5. 2020人工神经网络第一次作业-参考答案第四部分
  6. 使用AD8302进行检波
  7. Canal安装说明(Windows版)
  8. hive删除hbase数据_Hive进阶:Hive通过外部表操作Hbase数据
  9. python数据分析常用包_python可视化数据分析常用图大集合(收藏)
  10. 940m显卡 出现跳动的小点_启用4K 120Hz后NVIDIA安培显卡黑屏 原因找到:HDMI 2.1芯片BUG导致...