为什么要写数据结构,因为这是算法的灵魂。十年前我听老师讲这句话,觉得是扯淡,现在看来,确实是灵魂。没有见过鬼的人总觉得这世界上没有鬼,见过鬼的人也不会告诉别人鬼啥样(被吓死了呗)。
开始阅读博客之前,推荐大家一本书:《我的奋斗》作者罗永浩。
数据结构,顾名思义就是数据的结构,数据一般指数字、字符串等,结构就是数据的构造方式。计算机世界里的数据不能是杂乱无章的,必须要组织起来,就像人喜欢打扫卫生和喜欢干净一样,计算机也喜欢整齐的,有组织有纪律的数据。数据的组织方式多种多样,数据的格式和种类也有差别。为什么要有组织有纪律的组织数据呢?最好的答案就是搜索数据和对数据排序,或者在优化计算机处理速度的时候分析复杂度。
计算机用来处理的一个或者多个项,我们定义为一个集合。举个栗子,班集体,由老师、学生、课桌、板凳、黑板、教室、粉笔。。。等等组成的一个整体。所以我们认为班集体就是一个集合。在计算机世界里,狭义的讲就是进程或者更小的讲就是线程在处理数据的时候处理的对象的整体。所以,我们这里要讲的集合一般有线性的、层级的、图形状的、有序或者无需的数据组合的整体。
计算机处理数据最为常用的算法就是排序算法、搜索(查找)算法。这里优先介绍排序算法,而后介绍搜素算法的实现。
基本的排序算法有:选择排序、冒泡排序、插入排序
# -*- coding: UTF-8 -*-
#选择排序
def selectedSort(myList):
#获取list的长度
length = len(myList)
#一共进行多少轮比较
for i in range(0,length-1):
#默认设置最小值得index为当前值
smallest = i
#用当先最小index的值分别与后面的值进行比较,以便获取最小index
for j in range(i+1,length-1):
#如果找到比当前值小的index,则进行两值交换
if myList[j]<myList[smallest]:
tmp = myList[j]
myList[j] = myList[smallest]
myList[smallest]=tmp
return myList
#冒泡排序
def buffleSort(myList):
for i in range(0,len(myList)-1):
for j in range(i+1,len(myList)):
if myList[i] > myList[j]:
myList[i], myList[j] = myList[j], myList[i]
return myList
#插入排序
def insertionSort(myList):
# 插入排序
for i in range(1, len(myList)):
key = myList[i]
j = i - 1
while j >= 0:
if myList[j] > key:
myList[j + 1] = myList[j]
myList[j] = key
j -= 1
print(myList)
return myList
#主函数调用排序函数
if __name__ == '__main__':
myList = [8, 7, 5, 0, 6, 4, 3]
selectedSort(myList)
buffleSort(myList)
insertionSort(myList)
快速排序的算法有:分割排序和合并排序
快速排序的思想:首先从列表中点位置选取一项,定义为基准点。然后将列表的项分区。分而治之,对于字列表,递归的应用该过程。一个子列表包含了基准点左边的所有的项,另一个子列表包含了基准点右边的所有的项(一边大一边小)。每次遇到少于2个项的列表就结束。
基本的查找(搜索)算法有无序表的遍历查找法、序列表的二分法和插值法
# -*- coding: UTF-8 -*-
#遍历查找
def sequential_search(lis, key):
for i in range(len(lis)):
if lis[i] == key:
return i
else:
return False
#序列表的二分查找:在查找表中不断取中间元素与查找值进行比较,以二分之一的倍率进行表范围的缩小。
def binary_search(lis, key):
low = 0
high = len(lis) - 1
while low < high:
mid = int((low + high) / 2)
if key < lis[mid]:
high = mid - 1
elif key > lis[mid]:
low = mid + 1
else:
return mid
return False
#插值法:插了一个mid = low + int((high - low) * (key - lis[low])/(lis[high] - lis[low]))的值
def binary_search(lis, key):
low = 0
high = len(lis) - 1
while low < high:
mid = low + int((high - low) * (key - lis[low])/(lis[high] - lis[low]))
print("mid=%s, low=%s, high=%s" % (mid, low, high))
if key < lis[mid]:
high = mid - 1
elif key > lis[mid]:
low = mid + 1
else:
return mid
return False
if __name__ == '__main__':
LIST = [1, 5, 7, 8, 22, 54, 99, 123, 200, 222, 444]
result = binary_search(LIST, 99)
print(result)
基本算法介绍完毕,后续专门插入一章节专门介绍python中的数组、链表、栈、堆、树、图的实现。在学习机器学习的过程中,时常翻翻基础知识,往往给人带来源源不断的灵感。正所谓,温故而知新。