数据结构和算法学习一,开篇
引自: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)算法的成功运行时一步一步进行得,每一步的成功必须确立在原有的成功之上
【预告: 下一篇介绍循环和递归】
数据结构和算法学习一,开篇相关推荐
- 数据结构与算法学习笔记之 从0编号的数组
数据结构与算法学习笔记之 从0编号的数组 前言 数组看似简单,但掌握精髓的却没有多少:他既是编程语言中的数据类型,又是最基础的数据结构: 一个小问题: 为什么数据要从0开始编号,而不是 从1开始呢? ...
- python leetcode_leetcode 介绍和 python 数据结构与算法学习资料
for (刚入门的编程)的高中 or 大学生 leetcode 介绍 leetcode 可以说是 cs 最核心的一门"课程"了,虽然不是大学开设的,但基本上每一个现代的高水平的程序 ...
- 七桥问题c语言程序数据结构,数据结构与算法学习——图论
什么是图? 在计算机程序设计中,图结构也是一种非常常见的数据结构 但是图论其实是一个非常大的话题 图结构是一种与树结构有些相似的数据结构 图论是数学的一个分支,并且在数学概念上,树是图的一种 它以图为 ...
- 数据结构与算法学习笔记之 提高读取性能的链表(上)
数据结构与算法学习笔记之 提高读取性能的链表(上) 前言 链表(Linked list)比数组稍微复杂一点,在我们生活中用到最常见的应该是缓存,它是一种提高数据读取性能的技术,常见的如cpu缓存,浏览 ...
- 数据结构与算法学习笔记——链栈
数据结构与算法学习笔记(C语言) 链栈 在开始链栈的学习之前,我们先实现一下上一篇文章中提到的检查括号匹配的小程序,鉴于水平有限,本人就随便写一下代码好了,目标仅限于对功能的实现. /*用顺序栈这种数 ...
- 数据结构与算法学习笔记4:递归+分治法
数据结构与算法学习笔记4 递归 斐波那契数列 青蛙跳台阶问题 链表倒序打印 分治法 二分查找/折半查找 Binary Search 题目1:快速幂 题目2:如何判断一个数是否为2的次幂 递归 指在函数 ...
- 数据结构与算法学习⑤(BFS和DFS 贪心算法 二分查找)
数据结构与算法学习⑤ 数据结构与算法学习⑤ 1.BFS和DFS 1.1.深度优先搜索算法 1.2.广度优先搜索算法 面试实战 102. 二叉树的层序遍历 104. 二叉树的最大深度 515. 在每个树 ...
- 完全背包问题贪心算法c语言,数据结构与算法学习之路:背包问题的贪心算法和动态规划算法...
一.背包问题描述: 有N种物品和一个重量为M的背包,第i种物品的重量是w[i],价值是p[i].求解将哪些物品装入背包可使这些物品的费用总和不超过背包重量,且价值总和最大. 二.解决方法: 1.贪心算 ...
- LeetCode数据结构与算法学习Day03
LeetCode数据结构与算法学习Day03 图解数据结构与算法 59 I 滑动窗口最大值 题目描述: 解题思路: 59 II 队列的最大值 题目描述: 解题思路: 67 把字符串转换成整数 题目描述 ...
- 数据结构与算法学习④(哈夫曼树 图 分治回溯和递归)
数据结构与算法学习④(哈夫曼树 图 回溯和递归 数据结构与算法学习④ 1.哈夫曼树 1.1.相关概念 1.2.哈夫曼树的构建 1.3.哈夫曼编码 1.4.面试题 2.图 2.1.图的相关概念 2.2. ...
最新文章
- Camera HDR Algorithms
- 关于Android中的onCreate()多次被调用导致bindService被多次调用的问题...
- 二叉树的遍历:前序、中序、后序、层次遍历(仅例题)
- keras模型保存和加载
- Python3 中打的迭代器与生成器
- windows7下redis的安装实践
- 销傲销售过程GSP管理系统功能概述
- AEJoy —— 表达式之弹性震动模拟详解【JS】
- 【果壳笔记】生物信息学——陈小伟老师部分
- 如何更好的把平时的工作记录下来?这款便签可以高效记录工作日志
- 扰动分析 matlab,扰动材料力学有限元分析:基于MATLAB编程
- 3ds max 使用cloth修改器制作抱枕
- 个人网站学习实践(wordpress教程)
- IO_FILE hack FSOP
- MySQL常用类型转换函数总结
- 卖罐头(冬季每日一题 32)
- 在地址栏上输入一个url,到这个页面呈现出来,中间会发生什么?
- pycharm调试代码139错误的可能解决办法
- 汽车概论结业报告计算机系,无人驾驶汽车概论
- 万字长文!对比分析了多款存储方案,KeeWiDB最终选择自己来
热门文章
- 禁止服务器的协议,Windows 服务器禁用 SSL 2 和 SSL 3 协议
- python中x y表示_Python中表达式x += y和x = x+y 的区别详解
- 2021年春季学期-信号与系统-第四次作业参考答案-第七小题
- 第十六届全国大学生智能汽车竞赛 英飞凌特供芯片支持计划TC364TC377
- 2020人工神经网络第一次作业-参考答案第四部分
- 使用AD8302进行检波
- Canal安装说明(Windows版)
- hive删除hbase数据_Hive进阶:Hive通过外部表操作Hbase数据
- python数据分析常用包_python可视化数据分析常用图大集合(收藏)
- 940m显卡 出现跳动的小点_启用4K 120Hz后NVIDIA安培显卡黑屏 原因找到:HDMI 2.1芯片BUG导致...