编程语言应用

注册

 

发新话题 回复该主题

编程必备算法,学了立即提升能力 [复制链接]

1#

什么是算法?当我第一次接触到这个东西的时候,我产生了疑问。

其实算法就是解决问题的方法:

问题是什么?我们有什么?我们想得到什么?尝试最简单的方式解决看看如何改进当我们在尝试写算法的时候,我们可能考虑到算法的效率问题,这个算法是否在不同情况都能保证它的效率,所以我们要对自己写出的算法有一个评估。

关于描述一个算法的复杂度,我们有下面这个图。

增长顺序:

O(1)O(logn)O(n)O(nlogn)O(n^2)O(2^n)

随着输入越来越大,算法所运算的时间也会发生变化;用空间复杂度,时间复杂度来衡量一个算法。

注意:以下我们只考虑时间复杂度。

(1):

(n):

(n^2):

—Fibonacci:

这个使用递归来求斐波拉契数列时间复杂度为O(n^2),因为再最后returnf(n-1)+f(n-2),两个递归调用内有重复计算的地方。例如n=6,则递归为fi(5)+f(4),前一项递归为f(4)+f(3);后一项f(3)+f(2)这样下去......,你会发现f(4)计算了2次,f(3)计算了3次......,到最后你发现f(1)计算了7次。

改进版的算法(让其不用重复计算):

—BinarySearch(asortedlist)

Solution1:BruteForce(匹配法):

Solution2:BinarySearch(递归法):

Solution3:BinarySearch(分治法):

Solution2,3都是O(nlogn),将数据查找时间都大大缩短了;例如:1—里猜数的游戏,我们先猜50,这会让空间减半,下一次继续这样猜可以快速锁定。如果是1—000,会猜多少次呢?

—Sorting

Bubblesort(冒泡算法)例如[6,3,1,5,4,4]这样一个数列,相邻两个数比较,如果是前一个大于后一个则交换,所以得到第一个Pass:[3,1,5,4,3,6](此时6已经排好序了,循环了6次),第二个Pass是[1,3,4,2,5,6](此时5、6已经排好序了,循环了5次),第三个Pass是[1,3,2,4,5,6](此时4、5、6已经排好序了,循环了5次),第四个Pass是[1,2,3,4,5,6](此时3、4、5、6已经排好序了,循环了5次),第五个Pass(不变)是[1,2,3,4,5,6](此时2、3、4、5、6已经排好序了,循环了5次),第六个Pass(不变)是[1,2,3,4,5,6](此时1、2、3、4、5、6已经排好序了,循环了5次)。

按照这样的思路我们可以得到:

Insertsort(插入算法):例如[3,8,2,1,7,6,5]这样一个list,Pass1:前两个数比较顺序不变,Pass2:第二个和第三个数字比较交换位置([3,2,8,1,7,6,5]),‘2‘再与’3‘交换,这样使得前三项都为sorted了([2,3,8,1,7,6,5]),Pass3:’1‘和前面的已经sorted的数再进行插入比较([1,2,3,8,7,6,5])……

这个的时间复杂度是O(n^2)

Selsecionsort(选择算法):例如[3,8,4,2,1,6]这样一个list,先找这个list的最小的index(以下简称minIdx),这个minIdx=4,然后把第一个3和它交换位置(pass1:[1,8,4,2,3,6]),再找新的minIdx=3,和第二个8交换位置(pass1:[1,2,4,8,3,6])……

就类似这样去实现这个算法,这个比较简单(O(n^2)的复杂度

Mergesort(合并算法):这个是令我非常头疼的算法,随便给你一个数组[3,9,6,5,8,2,4,7],我们先要利用分治法(DIvideandconque)进行拆分,[3,9][6,5][8,2][4,7],然后每组进行sort,得到[3,9][5,6][2,8][4,7],左边两个进行Merge,右边两个进行Merge,然后得到[3,5,6,9][2,4,7,8],然后这个两个在进行大Merge,最终得到排好序的list。

这个Merge是如何实现的呢?

把[3,5,6,9]设为a,i指向第一个数字

把[2,4,7,8]设为b[j],j指向第一个数字

a[0]b[0],则把b[0]append到一个空list中去,然后j+1;

a[0]b[1],则把a[0]append到上一个list中去,然后i+1;

……

最后得到[2,3,4,5,6,7,8,9]

★注意:当i走到头了,j后面还有数字;也有可能j走到头了,i后面还有数字;这个时候就应该把多余的数字加到那个list后面。

所以我们写出了下面的代码:

关于Sort就说到这里,剩下还有QuickSort以及搜索算法将在在平坦的算法路上懵逼地曲折前进(二)上和大家讨论。

分享 转发
TOP
发新话题 回复该主题