如果说把最终写好的程序比喻成战场,代码便是士兵和武器。数据结构和算法则是兵法。
数据结构和算法是一项必备的基本功,不是一朝一夕就能练成的绝世高手,需要不断的主动学习积累。
算法有五大特性
1.输入:算法具有0个或者多个输入
2.输出:算法至少有一个或者多个输出
3.有穷性:算法在有限的步骤之后变自动结束而不会无限循环,并且每一个步骤都可以在可接受的时间内完成。
4.确定性:算法中每一个步骤都是有确定的含义,不会出现二义性
5.可行性:算法的每一步骤都是可行的,每一步骤都能够在有限的次数内执行完毕。
时间复杂度
数据是一个抽象的概念,将其进行分类后得到程序设计语言中的基本数据类型,比如:int,float,char等。数据元素之间不是独立的,存在特定的关系,这些关系便是结构。数据结构指的是数据对中的数据元素之间的关系。
很多高级程序设计语言提供了丰富的数据结构类型,由语言设计好的,不需要自己去定义数据结构。比如Python,其中包含了很多内置的数据结构,比如列表,元祖,字典,这些是Python内置的非常重要的数据结构。
算法和数据结构之间的区别
数据结构只是静态描述数据元素之间的关系。
高效的程序需要在数据结构的技术上设计和选择算法。
程序=数据结构+算法
算法是为了解决实际问题而设计的,数据结构便是算法需要处理的问题载体。
抽象数据类型(Abstract Data Type)
抽象数据类型(ADT)的含义是指一个数学模型以及定义在此数学模型上的一组操作。即把数据类型和数据类型上的运算捆在一起,进行封装。引入抽象数据类型的目的是把数据类型的表示和数据类型上运算的实现与这些数据类型和运算在程序中的引用隔开,使它们相互独立。
最常用的数据运算有五种:
插入
删除
修改
查找
排序
算法在程序中非常重要
import time
start_time = time.time()
# 注意是三重循环
for a in range(0, 1001):
for b in range(0, 1001):
for c in range(0, 1001):
if a**2 + b**2 == c**2 and a+b+c == 1000:
print("a, b, c: %d, %d, %d" % (a, b, c))
end_time = time.time()
print("elapsed: %f" % (end_time - start_time))
print("complete!")
T(n) = O(nnn) = O(n3)
优化后
import time
start_time = time.time()
# 注意是两重循环
for a in range(0, 1001):
for b in range(0, 1001-a):
c = 1000 - a - b
if a**2 + b**2 == c**2:
print("a, b, c: %d, %d, %d" % (a, b, c))
end_time = time.time()
print("elapsed: %f" % (end_time - start_time))
print("complete!")
T(n) = O(nn(1+1)) = O(n*n) = O(n2)
KMP算法
def KMP_algorithm(string, substring):
'''
KMP字符串匹配的主函数
若存在字串返回字串在字符串中开始的位置下标,或者返回-1
'''
pnext = gen_pnext(substring)
n = len(string)
m = len(substring)
i, j = 0, 0
while (i < n) and (j < m):
if (string[i] == substring[j]):
i += 1
j += 1
elif (j != 0):
j = pnext[j - 1]
else:
i += 1
if (j == m):
return i - j
else:
return -1
def gen_pnext(substring):
"""
构造临时数组pnext
"""
index, m = 0, len(substring)
pnext = [0] * m
i = 1
while i < m:
if (substring[i] == substring[index]):
pnext[i] = index + 1
index += 1
i += 1
elif (index != 0):
index = pnext[index - 1]
else:
pnext[i] = 0
i += 1
return pnext
if __name__ == "__main__":
string = 'abcxabcdabcdabcy'
substring = 'abcdabcy'
out = KMP_algorithm(string, substring)
print(out)