软件设计基础:3. 算法基础
1.算法的基本概念
-
有穷性:执行有穷布之后结束,且每一步都可在又穷时间内完成
-
确定性:算法中每一条指令读必须有确切的含义,不能含糊不清
-
输入和输出:输入>=0;输出>=1;
-
有效性:算法的每个步骤都能有效执行并能在执行的有限次后得到确定的结果。
2.算法的效率
- 时间复杂度:指程序运行从开始到结束所需要的时间
- 空间复杂度:指对一个算法在运行过程中,临时占用的存储空间大小的度量
3.查找算法
3.1顺序查找
即从头到尾查找,将目标元素与列表中的所有元素一一对应查找,查找的次数为1…n不等,所以查找的事件复杂度为O((1+N)/2);
3.2二分查找
- 就是折半算法。一直找中间的数进行对比。前提是序列是有序的,从小到大或者从大到小。
- 例题:在有 12 个元素的有序表 A[1,2, 3, …,12] 中进行折半查找( 0 号位置留空 ,忽略 ),查找元素 A[12] 时,被比较的元素下标依次是 (D ) 。
A.6 , 8 , 10 , 12B.6 , 8 , 11 , 12C.6 , 9 , 10 , 12D.6 , 9 , 11 , 12
3.3哈希表查找
关键码序列相同的元素,如果该空间已经被占用,则自动转换到改关键码序列的下一个地址空间。
4.排序算法
4.1排序算法的概念
- 稳定的排序算法:冒泡排序、插入排序、归并排序和基数排序。举个例子,如果Ai = Aj,Ai原来在位置前,排序后Ai还是要在Aj位置前。
- 不稳定的排序算法:选择排序、快速排序、希尔排序、堆排序
4.2插入类排序(基础排序,逐一对比插入)
-
插入类排序:一组有序序列:R1,R2…Ri。现在要加入一个新的数据Ri+1,则需要将其与前面的数据逐一对比,找到合适的地方插入。
-
希尔排序(跳跃分组排序):分多组排序。比如20个数据,先分10组排序,每组是两个数。再按5组排序,每组4个数字。以此类推。
4.3选择类排序(选择最小数,最小数换前)
-
简单选择排序:选择排序码最小的数,把它和第一个交换,然后剩下再重复上面的工作。
-
堆排序:分为大顶堆(从上到下,数字减小)和小顶堆(从上到下,数字增大)
4.4交换类排序
-
冒泡排序,两个比较,小的放前:
-
快速排序(分区法),最后一个数作为分区标准,分区之后再分区
4.5归并排序(逐步拆分分组法)
也称为合并,是多个有序表合并成一个有序表。如果是两个合并成一个,又叫二路合并。
4.6基数排序
一种靠关键字排序的方法。比如,先按个位数排序,然后按十位数排序,如下图所示
4.7 排序算法对比
5.算法策略
5.1算法策略概述
算法策略是指在问题空间中随机搜索所有可能的解决问题的方法,直至选择一种有效的方法解决问题,在行政规划,数学验证及物理检测等领域有着非常重要的作用。
5.2分治法
分治算法的基本思想是将一个问题分解为多个规模较小的子问题,这些子问题相互独立且与原问题性质相同。可用递归的方法解决问题。
典型的问题:归并排序、快速排序、二分搜索
5.3贪心法
在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。
典型的问题:背包问题(装箱)、多机调度、找零钱问题
本题考查算法设计与分析贪心相关知识。
贪心法在一般情况下一定能够得到满意解,不一定能够得到最优解。
贪心法能够获得最优解的前提是:(1)问题具有最优子结构,即规模为n的问题的最优解与规模为n-1的问题的解相关;(2)问题具有贪心选择性质,即问题的整体最优解可以通过一系列局部最优的选择得到。
只有部分背包问题具有以上性质,故可以通过贪心算法得到最优解。
5.4动态规划法
- 动态规划是一种将问题实例分解为更小的、相似的子问题,并存储子问题的解而避免计算重复的子问题,以解决最优化问题的算法策略。
- 矩阵乘法、背包问题、LCS最长公共子序列。
5.5回溯法
- 系统地搜索一个问题地所有解或者任意解,有试探和回退地的过程。
- 典型问题:N皇后问题、迷宫、背包问题。