算法基础知识
时间复杂度:指程序运行从开始到结束所需要的时间。通常分析时间复杂度的方法是从算法中选取一种对于所研究的问题来说是基本运算的操作,以该操作重复执行的次数是规模n的某个函数T(n)。由于许多情况下要精确计算T(n)是困难的,因此引入了渐进时间复杂度在数量上估计一个算法的执行时间。
常见的对算法执行所需时间的度量:O( 1 )<O( log₂n )<O( n )<O( n log₂n )<O( n² )<O( n³ )<O( 2ⁿ )
空间复杂度是指对一个算法在运行过程中临时占用的存储空间大小的度量。一个算法的空间复杂度只考虑在运行过程中为局部变量分配的存储空间大小。
查找
顺序查找:将待查找的关键字从头到尾与表中元素进行比较,如果中间存在关键字为key的元素,则返回成功,否则失败。时间复杂度O(n)。
二分查找:表中以按序排好。时间复杂度O( log₂n )
散列(哈希)表:根据设定的哈希函数和处理冲突的方法,将一组关键字映射到一个有限的连续的地址集上,并以关键字在地址集中的“像”作为记录在表中的存储位置。
- 线性探测法:按物理地址顺序取下一个空闲地址
- 伪随机数:将冲突的数据随机存入任意空闲
- 再散列法:原有的散列函数冲突之后,继续用此数据计算另一个哈希函数。
排序
稳定与不稳定排序:两个值在一个待排序序列中和排序后的顺序应该是相对不变的,则为稳定排序。
内排序和外排序:排序是在内存中进行的,还是在外部进行的。
排序的算法分类:
插入类:直接插入排序、希尔排序。
- 直接插入:在插入第i个记录时,R₁、R₂...Ri-1已经排好序,这时将Ri的关键字Ki和Ki-1,Ki-2等进行比较,从而找到应该插入的位置并将Ri插入,插入位置及其后的记录依次向后移动
- 希尔排序:先将整个待排记录序列分成若干子序列,然后分别进行直接插入排序,待整个序列中的记录基本有序时,再对全体记录进行一次直接插入排序。适合于大数据的排序。
交换类:冒泡排序、快速排序。
选择类:简单选择排序、堆排序。
- 简单选择排序:通过n-i(1≤i≤n)在次关键字中的比较,从n-i+1个记录中选出关键字最小的记录,并和第i个记录进行交换,当i等于n时所有记录有序排列。
- 堆排序:根据给出的待排序关键字建立初始堆;输入堆顶元素,并调整堆。利用完全二叉树。适用于在多个元素中找出前几名。
归并排序。
基数排序。
分治法
递归:子程序直接调用自己,或者通过一系列调用语句间接调用自己。两个基本要素:边界条件(确定递归何时终止,即递归出口)、递归模式(大问题分解为小问题,即递归体)
回溯法
可以系统的搜索问题的所有解或任意解。在包含问题的所有解的解空间树中,按照深度优先的策略,从根节点出发搜索解空间树,逐层向下,若到叶子结点仍没有包含问题的解,则向上回溯至有分支的结点,再次搜索空间树,直至找到解或遍历完所有结点。
一般用于解决迷宫类的问题。
动态规划法
在求解问题中,对于某一步决策,列出各种可能的局部解,再依据某种判定条件,舍弃哪些肯定不能得到最优解的局部解,再每一步经过筛选以每一步都是最优解来保证全局是最优解。
常用于求解具有某种最优性质的问题。
贪心法
总是做出在当前来说最好的选择,而不从整体上加以考虑,所做的每步选择只是当前步骤的局部最优选择,但从整体上不一定是最优的选择。由于它不为了寻找最优解而穷尽所有可能解,因此耗费时间少,一般可以快速得到满意的解,但得不到最优解。
局部贪心,只针对于当前的步骤取最优,而非整体考虑
分支限界法
与回溯法类似,同样是在问题的解空间树上搜索问题解的算法。
搜索原理:在分支限界法中,每一个活结点只有一次机会成为扩展节点。活结点一旦成为扩展结点,就一次性产生其所有儿子结点。在这些儿子结点中,导致不可行解或导致非最优解的儿子结点被舍弃,其余儿子结点被加入活结点表中。此后从活结点表中取下一结点成为当前扩展结点并重复上述结点扩展过程。
从活结点表中选择下一个扩展结点的类型:
队列式分支限界法:按照队列先进先出原则选取下一个节点为扩展节点。
优先队列式分支限界法:按照优先队列中规定的优先级选取优先级最高的节点成为当前节点。
概率算法
在算法执行某些步骤时,可以随机地选择下一步该如何进行,同时允许结果以较小的概率出现错误,并以此为代价,获得算法运行时间的大幅度减少(降低算法复杂度)。
基本特征是对所求解问题的同一实例用同一概率算法求解两次,可能得到完全不同的效果。
如果一个问题没有有效的确定性算法可以在一个合理的时间内给出解,但是该问题能接受小概率错误,那么采用概率算法就可以快速找到这个问题的解。
四类概率算法:数值概率算法(数值问题的求解)、蒙特卡洛算法(求问题的精确解)、拉斯维加斯算法(不会得到不正确的解)、舍伍德算法(总能求得问题的一个正确解)。
近似算法
解决难解问题的一种有效策略,其基本思想是放弃求最优解,而用近似解代替最优解,以换取算法设计上的简化和时间复杂度的降低。
虽然找不到最优解,但是会给待求解的问题提供一个解。
为了具有实用性,近似算法必须能够给出算法所产生的解与最优解之间的差别或者比例的一个界限,它保证任意一个实例的近似最优解与最优解之间的相差程度。显然,差别越小,近似算法越具有实用性。
衡量近似算法的两个标准:
- 算法的时间复杂度,必须是多项式阶的,这是近似算法的基本目标
- 解的近似程度,近似程度与近似算法本身、问题规模,乃至不同的输入实例有关。
数据挖掘算法
概述:分析爆炸式增长的各类数据的技术,以发现隐含在这些数据中的有价值的信息和知识。其核心是算法,主要功能包含分类、回归、关联规则和聚类等。
分类:是一种有监督的学习过程,根据历史数据预测未来数据的模型 。
分类的数据对象属性:一般属性、分类属性或目标属性。
分类设计的数据:训练数据集、测试数据集、未知数据。
数据分类的两个步骤:学习模型(基于训练数据集采用分类算法建立学习模型)、应用模型(应用测试数据集的数据到学习模型中,根据输出来评估模型的好坏以及将未知数据输入到学习模型中,预测数据的类型)。
分类算法:决策树归纳(自顶向下的递归树算法)、朴素贝叶斯算法、后向传播BP、支持向量机SVM。
频繁模式和关联规则挖掘:挖掘海量数据中的频繁模式和关联规则可以有效地指导企业发现交叉销售机会、进行决策分析和商务管理等。
聚类:是一种无监督学习的过程,根据数据特征,将相似的数据对象归为一类,不相似的数据对象归到不同类中。
典型算法:基于划分的方法、基于层次的方法、基于密度的方法、基于网格的方法、基于统计模型的方法。
数据挖掘的应用:信用分析、定向促销顾客的分类与聚类等。