算法是啥
‘壹’ 常用的排序算法都有哪些
排序算法 所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。
分类
在计算机科学所使用的排序算法通常被分类为:
计算的复杂度(最差、平均、和最好表现),依据串行(list)的大小(n)。一般而言,好的表现是O。(n log n),且坏的行为是Ω(n2)。对于一个排序理想的表现是O(n)。仅使用一个抽象关键比较运算的排序算法总平均上总是至少需要Ω(n log n)。
记忆体使用量(以及其他电脑资源的使用)
稳定度:稳定排序算法会依照相等的关键(换言之就是值)维持纪录的相对次序。也就是一个排序算法是稳定的,就是当有两个有相等关键的纪录R和S,且在原本的串行中R出现在S之前,在排序过的串行中R也将会是在S之前。
一般的方法:插入、交换、选择、合并等等。交换排序包含冒泡排序(bubble sort)和快速排序(quicksort)。选择排序包含shaker排序和堆排序(heapsort)。
当相等的元素是无法分辨的,比如像是整数,稳定度并不是一个问题。然而,假设以下的数对将要以他们的第一个数字来排序。
(4, 1) (3, 1) (3, 7) (5, 6)
在这个状况下,有可能产生两种不同的结果,一个是依照相等的键值维持相对的次序,而另外一个则没有:
(3, 1) (3, 7) (4, 1) (5, 6) (维持次序)
(3, 7) (3, 1) (4, 1) (5, 6) (次序被改变)
不稳定排序算法可能会在相等的键值中改变纪录的相对次序,但是稳定排序算法从来不会如此。不稳定排序算法可以被特别地时作为稳定。作这件事情的一个方式是人工扩充键值的比较,如此在其他方面相同键值的两个物件间之比较,就会被决定使用在原先资料次序中的条目,当作一个同分决赛。然而,要记住这种次序通常牵涉到额外的空间负担。
排列算法列表
在这个表格中,n是要被排序的纪录数量以及k是不同键值的数量。
稳定的
冒泡排序(bubble sort) — O(n2)
鸡尾酒排序 (Cocktail sort, 双向的冒泡排序) — O(n2)
插入排序 (insertion sort)— O(n2)
桶排序 (bucket sort)— O(n); 需要 O(k) 额外 记忆体
计数排序 (counting sort) — O(n+k); 需要 O(n+k) 额外 记忆体
归并排序 (merge sort)— O(n log n); 需要 O(n) 额外记忆体
原地归并排序 — O(n2)
二叉树排序 (Binary tree sort) — O(n log n); 需要 O(n) 额外记忆体
鸽巢排序 (Pigeonhole sort) — O(n+k); 需要 O(k) 额外记忆体
基数排序 (radix sort)— O(n·k); 需要 O(n) 额外记忆体
Gnome sort — O(n2)
Library sort — O(n log n) with high probability, 需要 (1+ε)n 额外记忆体
不稳定
选择排序 (selection sort)— O(n2)
希尔排序 (shell sort)— O(n log n) 如果使用最佳的现在版本
Comb sort — O(n log n)
堆排序 (heapsort)— O(n log n)
Smoothsort — O(n log n)
快速排序 (quicksort)— O(n log n) 期望时间, O(n2) 最坏情况; 对于大的、乱数串行一般相信是最快的已知排序
Introsort — O(n log n)
Patience sorting — O(n log n + k) 最外情况时间, 需要 额外的 O(n + k) 空间, 也需要找到最长的递增子序列(longest increasing subsequence)
不实用的排序算法
Bogo排序 — O(n × n!) 期望时间, 无穷的最坏情况。
Stupid sort — O(n3); 递回版本需要 O(n2) 额外记忆体
Bead sort — O(n) or O(√n), 但需要特别的硬体
Pancake sorting — O(n), 但需要特别的硬体
排序的算法
排序的算法有很多,对空间的要求及其时间效率也不尽相同。下面列出了一些常见的排序算法。这里面插入排序和冒泡排序又被称作简单排序,他们对空间的要求不高,但是时间效率却不稳定;而后面三种排序相对于简单排序对空间的要求稍高一点,但时间效率却能稳定在很高的水平。基数排序是针对关键字在一个较小范围内的排序算法。
插入排序
冒泡排序
选择排序
快速排序
堆排序
归并排序
基数排序
希尔排序
插入排序
插入排序是这样实现的:
首先新建一个空列表,用于保存已排序的有序数列(我们称之为"有序列表")。
从原数列中取出一个数,将其插入"有序列表"中,使其仍旧保持有序状态。
重复2号步骤,直至原数列为空。
插入排序的平均时间复杂度为平方级的,效率不高,但是容易实现。它借助了"逐步扩大成果"的思想,使有序列表的长度逐渐增加,直至其长度等于原列表的长度。
冒泡排序
冒泡排序是这样实现的:
首先将所有待排序的数字放入工作列表中。
从列表的第一个数字到倒数第二个数字,逐个检查:若某一位上的数字大于他的下一位,则将它与它的下一位交换。
重复2号步骤,直至再也不能交换。
冒泡排序的平均时间复杂度与插入排序相同,也是平方级的,但也是非常容易实现的算法。
选择排序
选择排序是这样实现的:
设数组内存放了n个待排数字,数组下标从1开始,到n结束。
i=1
从数组的第i个元素开始到第n个元素,寻找最小的元素。
将上一步找到的最小元素和第i位元素交换。
如果i=n-1算法结束,否则回到第3步
选择排序的平均时间复杂度也是O(n²)的。
快速排序
现在开始,我们要接触高效排序算法了。实践证明,快速排序是所有排序算法中最高效的一种。它采用了分治的思想:先保证列表的前半部分都小于后半部分,然后分别对前半部分和后半部分排序,这样整个列表就有序了。这是一种先进的思想,也是它高效的原因。因为在排序算法中,算法的高效与否与列表中数字间的比较次数有直接的关系,而"保证列表的前半部分都小于后半部分"就使得前半部分的任何一个数从此以后都不再跟后半部分的数进行比较了,大大减少了数字间不必要的比较。但查找数据得另当别论了。
堆排序
堆排序与前面的算法都不同,它是这样的:
首先新建一个空列表,作用与插入排序中的"有序列表"相同。
找到数列中最大的数字,将其加在"有序列表"的末尾,并将其从原数列中删除。
重复2号步骤,直至原数列为空。
堆排序的平均时间复杂度为nlogn,效率高(因为有堆这种数据结构以及它奇妙的特征,使得"找到数列中最大的数字"这样的操作只需要O(1)的时间复杂度,维护需要logn的时间复杂度),但是实现相对复杂(可以说是这里7种算法中比较难实现的)。
看起来似乎堆排序与插入排序有些相像,但他们其实是本质不同的算法。至少,他们的时间复杂度差了一个数量级,一个是平方级的,一个是对数级的。
平均时间复杂度
插入排序 O(n2)
冒泡排序 O(n2)
选择排序 O(n2)
快速排序 O(n log n)
堆排序 O(n log n)
归并排序 O(n log n)
基数排序 O(n)
希尔排序 O(n1.25)
冒泡排序
654
比如说这个,我想让它从小到大排序,怎么做呢?
第一步:6跟5比,发现比它大,则交换。564
第二步:5跟4比,发现比它大,则交换。465
第三步:6跟5比,发现比它大,则交换。456
‘贰’ 数学中都有什么算法啊
定义法、配方法、待定系数法、换元法、反证法、数学归纳法、导数法、赋值法、消去法、定比分离法、比较法、分析法、综合法 ,,,还有很多桑
介里有几个比较详细的哈。。。
一、换元法
“换元”的思想和方法,在数学中有着广泛的应用,灵活运用换元法解题,有助于数量关系明朗化,变繁为简,化难为易,给出简便、巧妙的解答。
在解题过程中,把题中某一式子如f(x),作为新的变量y或者把题中某一变量如x,用新变量t的式子如g(t)替换,即通过令f(x)=y或x=g(t)进行变量代换,得到结构简单便于求解的新解题方法,通常称为换元法或变量代换法。
用换元法解题,关键在于根据问题的结构特征,选择能以简驭繁,化难为易的代换f(x)=y或x=g(t)。就换元的具体形式而论,是多种多样的,常用的有有理式代换,根式代换,指数式代换,对数式代换,三角式代换,反三角式代换,复变量代换等,宜在解题实践中不断总结经验,掌握有关的技巧。
例如,用于求解代数问题的三角代换,在具体设计时,宜遵循以下原则:(1)全面考虑三角函数的定义域、值域和有关的公式、性质;(2)力求减少变量的个数,使问题结构简单化;(3)便于借助已知三角公式,建立变量间的内在联系。只有全面考虑以上原则,才能谋取恰当的三角代换。
换元法是一种重要的数学方法,在多项式的因式分解,代数式的化简计算,恒等式、条件等式或不等式的证明,方程、方程组、不等式、不等式组或混合组的求解,函数表达式、定义域、值域或最值的推求,以及解析几何中的坐标替换,普通方程与参数方程、极坐标方程的互化等问题中,都有着广泛的应用。
二、消元法
对于含有多个变数的问题,有时可以利用题设条件和某些已知恒等式(代数恒等式或三角恒等式),通过适当的变形,消去一部分变数,使问题得以解决,这种解题方法,通常称为消元法,又称消去法。
消元法是解方程组的基本方法,在推证条件等式和把参数方程化成普通方程等问题中,也有着重要的应用。
用消元法解题,具有较强的技巧性,常常需要根据题目的特点,灵活选择合适的消元方法
三、待定系数法
按照一定规律,先写出问题的解的形式(一般是指一个算式、表达式或方程),其中含有若干尚待确定的未知系数的值,从而得到问题的解。这种解题方法,通常称为待定系数法;其中尚待确定的未知系数,称为待定系数。
确定待定系数的值,有两种常用方法:比较系数法和特殊值法。
四、判别式法
实系数一元二次方程
ax2+bx+c=0 (a≠0) ①
的判别式△=b2-4ac具有以下性质:
>0,当且仅当方程①有两个不相等的实数根
△ =0,当且仅当方程①有两个相等的实数根;
<0,当且仅当方程②没有实数根。
对于二次函数
y=ax2+bx+c (a≠0)②
它的判别式△=b2-4ac具有以下性质:
>0,当且仅当抛物线②与x轴有两个公共点;
△ =0,当且仅当抛物线②与x轴有一个公共点;
<0,当且仅当抛物线②与x轴没有公共点。
五、 分析法与综合法
分析法和综合法源于分析和综合,是思维方向相反的两种思考方法,在解题过程中具有十分重要的作用。
在数学中,又把分析看作从结果追溯到产生这一结果的原因的一种思维方法,而综合被看成是从原因推导到由原因产生的结果的另一种思维方法。通常把前者称为分析法,后者称为综合法。
六、 数学模型法
例(哥尼斯堡七桥问题)18世纪东普鲁士哥尼斯堡有条普莱格河,这条河有两个支流,在城中心汇合后流入波罗的海。市内办有七座各具特色的大桥,连接岛区和两岸。每到傍晚或节假日,许多居民来这里散步,观赏美丽的风光。年长日久,有人提出这样的问题:能否从某地出发,经过每一座桥一次且仅一次,然后返回出发地?
数学模型法,是指把所考察的实际问题,进行数学抽象,构造相应的数学模型,通过对数学模型的研究,使实际问题得以解决的一种数学方法。
七、配方法
所谓配方,就是把一个解析式利用恒等变形的方法,把其中的某些项配成一个或几个多项式正整数次幂的和形式。通过配方解决数学问题的方法叫配方法。其中,用的最多的是配成完全平方式。配方法是数学中一种重要的恒等变形的方法,它的应用十分非常广泛,在因式分解、化简根式、解方程、证明等式和不等式、求函数的极值和解析式等方面都经常用到它。
八、因式分解法
因式分解,就是把一个多项式化成几个整式乘积的形式。因式分解是恒等变形的基础,它作为数学的一个有力工具、一种数学方法在代数、几何、三角等的解题中起着重要的作用。因式分解的方法有许多,除中学课本上介绍的提取公因式法、公式法、分组分解法、十字相乘法等外,还有如利用拆项添项、求根分解、换元、待定系数等等。
九、换元法
换元法是数学中一个非常重要而且应用十分广泛的解题方法。我们通常把未知数或变数称为元,所谓换元法,就是在一个比较复杂的数学式子中,用新的变元去代替原式的一个部分或改造原来的式子,使它简化,使问题易于解决。
介里LL没有说很详细桑,,,,内啥简便算法我也一起说了桑丶
乘法交换律,乘法分配律,加法交换律,加法结合律,乘法分配律,
‘叁’ 数学建模里面的模型和算法有啥区别
模型是一个或者一系列的数学表达式,用来描述所要解决的问题。
算法是解决这个模型,也就是这些表达式的具体过程,常常结合编程解决。
‘肆’ 基因遗传算法是个啥求详解
基因遗传算法主要理论就是优胜劣汰的进化论。
它的主要精神是透过每次迭代都能比上次更进步,逐步演化,表现出针对一个目标函数寻求最佳解的过程。但是因为是随机搜索,所以虽然基因算法设置如交配、突变等来避免,却仍可能会陷入区域最佳解;也有可能最后得到的不是最佳解,只是在结束条件之前找到的最好的解。
基本的基因算法流程:
1.初始化族群:假定这个族群中有4条染色体,每条染色体有5个基因。
基因 -从目标函数的角度来看,就是自变数。
例如:用基因算法解目标函数 f(X,Y,Z)=2X+3Y-Z,
限制式为“X,Y,Z={1,0}”※,
求目标函数的最大值。
此题目对应到染色体的概念,就有3个基因,
三个基因分别代表X、Y、Z三个自变数的值。
染色体 -单一组解
例如:有很多符合目标函数限制式的(X,Y,Z),
其中一组是(x1,y1,z1)=(1,0,0),
函数值 f(x1,y1,z1)为2*1+3*0-0=2。
此例中,这组解当然不是最佳解,但它是这个题目的一个可行解。
*想象我们用直觉解题,拿张计算纸,把所有可行解都列出来,
然后比较所有我们想得到的可行解,最后可以得
到最佳的一组(X,Y,Z),因为它的f(X,Y,Z)为最大值。
族群 -多组解的集合
例如:族群中有四条染色体,这四条染色体就是四组可行解。
2.设定交配率和突变率:假定交配率a为0.6,突变率b为0.1。
交配率 -每个世代中,族群内有多少比率的染色体会互相交配。
突变率 -每个世代中,族群内的染色体有多少机率会突变。
3.迭代世代。
For iter=10 -假定做十次优胜劣汰。
3.1. 天择:在这个世代中,根据每条染色体的权重,随机选择母代来产生后代,
用以做下一个运算。
通常使用轮盘法来作天择,也就是说,
如果染色体甲的解是这个族群中最好的,
那么甲的权重就是最高的。反之则是最低的。
*轮盘法:假定这次族群为“[1,1,1],[0,1,1],[1,0,1],[1,0,0]”,
四条染色体的适应值分别是“4,2,1,2”,
适应值总和为4+2+1+2=9,
则四条染色体被选到的机会为“4/9,2/9,1/9,2/9”
=“0.4,0.2,0.1,0.2”。这个机会就是权重。
为了不让每次选择都选到同一条染色体,所以只是
“有比较高的机会”选择到“有更好适应值的染色体”,
而不是一定会选择这个好适应值的染色体。
3.2. 交配:母代产生后,依照交配率a,随机选择染色体来作交配。
比较交配前的子代1和交配后的子代2,在8条染色体中,
选择适应值最好的4条染色体留下来。
最简单的交配方式就是交换两条染色体的某个基因。
*例如,染色体S=[0,1,0],染色体Q=[1,1,1],交配位于首位的基因,
则可以得到新的两条染色体S'=[1,1,0]、Q'=[0,1,1]。
3.3. 突变:交配完后,依照突变率b,决定这一个世代要不要突变。
假设要突变,则若突变后子代3的适应值比突变前子代2好,就用子代3取代子代2。
最简单的突变方式就是随机选择某条染色体的某个基因,改变它。
*例如,随机选中染色体M=[1,0,1],随机突变中间的基因,
得到新染色体M'=[1,1,1] 。
3.4. 更新:最后得到的族群中,所有染色体的适应值。
END For
4. 比较所有染色体的适应值,列出最好的那一个染色体为算法最后的解。
※一般使用二元染色体,限制染色体的基因只会等于零或壹。
在此处只是方便解说,所以直接把限制式设成零和壹。
假设我们用二元染色体来解目标函数f(x)=x^2的最大值,限制式为0<=x<=7,x为整数。
用基因算法求解,则需要产生log_2(8)=3个基因,
简单说来,就是用二进位表示一个有限整数值。
(也可以把基因想成电脑的位元数,我们用三个位元来表示一个有限的整数值。)
这样做的话,突变的方法就是直接把某个基因转成零或壹,
不用设定要更改多少值(例如加3、加100或减0.8)(基因算法应该一般不会这样做);
计算适应值时,互相转换二进位与十进位。
基因三个,则可以表达:
111=2^2+2^1+2^0=4+2+1=7
110=2^2+2^1=4+2=6
101=2^2+2^0=4+1=5
100=4
001=1
000=0
011=3
010=2