算法是一组完成任务的指令。当数据量比较大的时候,算法的优劣对程序的性能好坏极为重要python
算法的速度指的并不是时间,而是操做数的增速算法
谈论算法的速度时,咱们说的是随着输入的增长,其运行时间将以什么样的速度增长数组
算法的运行时间用大 O 表示法表示数据结构
大 O 表示法指出了最糟状况下的运行时间app
O(logn) 比 O(n) 快,当须要搜索的元素越多时,前者比后者快得越多函数
数组:元素在内存中都是相连的性能
链表:元素可存储在内存中任何地方,并不必定是相连的spa
数组擅长读取,链表擅长插入与删除(数组支持随机访问,而链表只能顺序访问)3d
数组 | 链表 | |
---|---|---|
读取 | O(1) | O(n) |
插入 | O(n) | O(1) |
删除 | O(n) | O(1) |
定义:函数本身调用本身code
递归条件:函数调用本身
基线条件:函数再也不调用本身,从而避免造成无限循环
元素 后进先出(LIFO) 的一种数据结构
def greet2(name):
print("how are you, " + name + "?")
def bye():
print("ok, bye!")
def greet(name):
print("hello, " + name + "!")
greet2(name)
print("getting ready to say bye...")
bye()
复制代码
调用 greet("maggie"),内存分配状况:
接下来,打印 hello, maggie! 再调用 greet2("maggie")
打印 hello are you, maggie? 而后从函数返回。栈顶内存块被弹出。
调用另外一个函数时,当前函数暂停并处于未完成状态。接下来,打印 getting ready to say bye...,调用函数 bye()
打印 ok bye! 从函数返回
用于存储多个变量的栈就是调用栈
递归函数使用调用栈,例如:
def fact(x):
if x == 1:
return 1
else:
return x * fact(x-1)
复制代码
只适用于有序元素列表
目的: 查找某个数是否存在于数组中
算法: 前提条件:a 为数组,first 和 last 分别指向数组的头尾,mid 指向数组的中间项,value 为要查找的数
若是 first > last, 返回 None(没有找到元素),不然循环执行如下程序: mid = (first + last) // 2
代码:
def BinarySearch(a, value):
first = 0
last = len(a) - 1
while first <= last:
mid = (first + last) // 2
guess = a[mid]
if guess < value:
first = mid + 1
elif guess > value:
last = mid - 1
else:
return mid
return None
复制代码
二分查找的时间复杂度:O(logn)
每次都找出数组中最小的元素,并添加到新数组中
代码(找出最小值):
def findSmallest(arr):
smallest = arr[0]
smallest_index = 0
for i in range(1, len(arr)):
if arr[i] < smallest:
smallest = arr[i]
smallest_index = i
return smallest_index
复制代码
代码(添加到新数组):
def selectionSort(arr):
newArr = []
for i in range(len(arr)):
smallest = findSmallest(arr)
newArr.append(arr.pop(smallest))
return newArr
复制代码
选择排序时间复杂度: