图的最短路径算法
Floyd最短路算法
http://blog.51cto.com/ahalei/1383613
核心代码:
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(e[i][j]>e[i][k]+e[k][j])
e[i][j]=e[i][k]+e[k][j];
Dijkstra最短路算法
http://blog.51cto.com/ahalei/1387799
//Dijkstra算法核心语句
for(i=1;i<=n-1;i++)
{
//找到离1号顶点最近的顶点
min=inf;
for(j=1;j<=n;j++)
{
if(book[j]==0 && dis[j]<min)
{
min=dis[j];
u=j;
}
}
book[u]=1;
for(v=1;v<=n;v++)
{
if(e[u][v]<inf)
{
if(dis[v]>dis[u]+e[u][v])
dis[v]=dis[u]+e[u][v];
}
}
}
M:边的数量
N:节点数量
通过上面的代码我们可以看出,这个算法的时间复杂度是O(N2)。其中每次找到离1号顶点最近的顶点的时间复杂度是O(N),这里我们可以用“堆”(以后再说)来优化,使得这一部分的时间复杂度降低到O(logN)。另外对于边数M少于N2的稀疏图来说(我们把M远小于N2的图称为稀疏图,而M相对较大的图称为稠密图),我们可以用邻接表(这是个神马东西?不要着急,下周再仔细讲解)来代替邻接矩阵,使得整个时间复杂度优化到O( (M+N)logN )。请注意!在最坏的情况下M就是N2,这样的话MlogN要比N2还要大。但是大多数情况下并不会有那么多边,因此(M+N)logN要比N2小很多。
用邻接表代替邻接矩阵存储
http://blog.51cto.com/ahalei/1387799
可以发现使用邻接表来存储图的时间空间复杂度是O(M),遍历每一条边的时间复杂度是也是O(M)。如果一个图是稀疏图的话,M要远小于N2。因此稀疏图选用邻接表来存储要比邻接矩阵来存储要好很多。
汉诺塔
https://www.zhihu.com/question/24385418/answer/89435529
杨辉三角
https://blog.csdn.net/zmy_3/article/details/51173580
def triangles():
N=[1]
while True:
yield N
N.append(0)
N=[N[i-1] + N[i] for i in range(len(N))]
n=0
for t in triangles():
print(t)
n=n+1
if n == 10:
break
回文数/回文串
return a == a[::-1]
# 字符串/数字
a = len(s)
i = 0
while i <= (a/2):
if s[i] == s[a-1-i]:
i += 1
else:
return False
return True
# 数字
def isPalindrome(x):
if x < 0:
return False
temp = x
y = 0
while temp:
print temp, y*10, temp%10
y = y*10 + temp%10
temp /= 10
return x == y
斐波拉契数列(Fibonacci)
def fibonacci(): # 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89
f = [0] * MAXSIZE
f[0] = 1
f[1] = 1
for i in range(2, MAXSIZE):
f[i] = f[i-1] + f[i-2]
return f
fibs = [1,1]
for i in range(8):
fibs.append(fibs[-2] + fibs[-1])
最大子序列与最大子矩阵问题
数组的最大子序列问题
给定一个数组,其中元素有正,也有负,找出其中一个连续子序列,使和最大。
https://blog.csdn.net/qqxx6661/article/details/78167981
最大子矩阵问题
给定一个矩阵(二维数组),其中数据有大有小,请找一个子矩阵,使得子矩阵的和最大,并输出这个和。
https://blog.csdn.net/kavu1/article/details/50547401
原始矩阵可以是二维的。假设原始矩阵是一个3 * n 的矩阵,那么它的子矩阵可以是 1 * k, 2 * k, 3 * k,(1 <= k <= n)。 如果是1*K,这里有3种情况:子矩阵在第一行,子矩阵在第二行,子矩阵在第三行。如果是 2 * k,这里有两种情况,子矩阵在第一、二行,子矩阵在第二、三行。如果是3 * k,只有一种情况。
为了能够找出最大的子矩阵,我们需要考虑所有的情况。假设这个子矩阵是 2 * k, 也就是说它只有两行,要找出最大子矩阵,我们要从左到右不断的遍历才能找出在这种情况下的最大子矩阵。如果我们把这两行上下相加,情况就和求“最大子段和问题” 又是一样的了。
KMP算法
https://blog.csdn.net/qqxx6661/article/details/79583707