算法基础2
三、旅行商
有一位旅行商,要去北上广深,问:要算出最短路线,要多少次?
答案是432*1,也就是O(n!)
这是最慢的算法,目前也没有什么好算法解决旅行商问题。
四、几种常用数据结构
1、什么是内存
你去超市,超市外面有寄存柜,你把东西放进去,然后获得一张条子,条子上面写了一个你柜子的位置。内存就相当于一个个柜子的集合,放在里面的是数据,对应的位置就是地址,你可以根据地址找到数据。但是这些柜子,都很小,每个只能放一点点东西,于是你的一堆数据,就需要这么一堆柜子,有这么一堆地址。
2、什么是数组
数组是这里介绍的第一种数据结构,你见过它的,没错就是上面那个列表。数组的别称就叫列表。
现在有一个排列得像Excel表格一样的柜子集,你把东西放在一排连着的抽屉里,这就是数组,内存是连着的。
只要知道第任意一个东西在哪,而且知道它是第几个,就能找到所有的你存放了东西的柜子。那个“几”叫做索引,那些东西叫做元素。东西的数量叫做列表长。如果元素的排列有顺序,就叫有序列表。
3、数组的优缺点
数组的优点很明显,你想要什么东西,知道它的索引,可以直接得到它,因为你清楚知道每一个东西的位置。
数组的缺点就是,某些内存会被其他人占用掉,可能连着的柜子的长度小于列表长,数组就放不进去。
解决办法是,优先声明一些柜子是自己的。但是这样又有两个缺点:第一个,列表长度不够就是占着茅坑不拉屎,浪费内存。第二个,列表长度太长了,函数没有用。
插入元素时,要将其侯敏的元素整体后移,如果位置不够就溢出。
4、什么是链表
链表是这里介绍的第二个数据结构。
没有连着的足够的柜子了,OK好办!算一下有多少东西,打开多少柜子。然后把东西全放进去,把最后一个的地址,也就是那个条子,塞倒数第二个柜子里面,……,一直到把第二个的地址,塞到第一个柜子里。只要知道第一个东西在哪个抽屉,可以根据里面的地址,找到第二个抽屉,进而找到所有。
5、链表的优缺点
链表的优点就是东西随便放,只要把后面的东西的地址放在前一个抽屉就行。
链表的缺点是,如果我要拿到最后一个东西,我要从第一个柜子,然后一个个打开,才能拿到它。
插入元素时,只要修改一个元素的指向即可。
6、什么是字典
字典是这里介绍的第三种数据结构。别名散列表,散列映射,映射,关联数组。
柜子装上了智能系统,输入东西名字,就能直接找到。
优点是不需要连着的内存,取东西也很快。
7、三种数据结构的运行时间
数据结构 | 插入时间 | 取出(删除)时间 |
---|---|---|
数组 | O(n) | O(1) |
链表 | O(1) | O(n) |
字典 | O(1) | O(1) |
8、什么是栈
你有一个桶,往里面装石头。这个桶就是一个栈。当你要取出石头时,要先取出最上面的石头。
栈是一种后进先出的结构。
9、什么是队列
一伙人在排队,先来的先排到。
队列是一种先进先出的结构。
10、什么是双端队列
栈加队列。
11、什么是元组
内容不可变的列表。
五、选择排序
1、选择排序
你的手机里存储了许多歌曲,它们都被你反反复复听了很多遍,现在你想把它们按照播放次数从小到大排序。如果采取简单查找,第一次看n个,第二次看n-1个,……共进行n次服从一个等差数列。
2、代码
#给列表从小到大排序
arr=[5,6,3,2,7,8,9,4,1]
sort_arr = []#定义一个空列表,用来装排序好的元素
def choice_sort(arr,sort_arr):
smaller = arr[0]#定义一个最小元素
smaller_index = 0#定义一个最小元素的索引
for i in range(len(arr)):
if arr[i] < smaller:
#只要列表中有元素比它小,这个元素成为新的最小元素,也有新的最小索引
smaller = arr[i]
smaller_index = i
sort_arr.append(smaller)#添加最小元素
arr.pop(smaller_index)
#原列表删除这个最小元素,反复迭代,直到原列表为空
if arr:
choice_sort(arr,sort_arr)
else:
print(sort_arr)
choice_sort(arr,sort_arr)