前言
昨天开始看《算法图解》,虽然之前自学408有接触过这些算法但是平常少用又忘得差不多了,听闻这本书对加深理解很有用处,就拿起来看一遍,昨天读了几页,还是很生动上头的,笔记主要记录一些容易忘记的概念和收获。
算法简介
二分查找
-
def binary_search(list, item): low = 0 high = len(list)—1 # low和high用于跟踪要在其中查找的列表部分 while low <= high: # 只要范围没有缩小到只包含一个元素 mid = (low + high) # 就检查中间的元素 guess = list[mid] if guess == item: # 找到了元素 return mid if guess > item: # 猜的数字大了 high = mid - 1 else: # 猜的数字小了 low = mid + 1 return None # 没有指定的元素
- 前提是有序数组,运行时间为O(logn)
大O表示法
- 大O表示法指的是最糟糕状态的运行时间。
- 谈论算法的速度时,我们说的是随着输入的增加,其运行时间将以什么样的速度增加。
- 旅行商问题:走完n个城市找最短路径,O(n!)
选择排序
- 数组随机存取,链表顺序存取(增加指向下一个元素的指针)
- 两者结合:数组链表
- 选择排序:找到最小/大,放到新数组头,O(n²)
-
# 找出数组中最小元素 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
递归
- 循环可能性能更高,递归更容易理解
- 递归条件:函数调用自己的方法
- 基线条件:则指的是函数不再调用自己,避免无限循环
- 调用栈:单出口压入和弹出,用于存储多个函数的变量
快速排序
- 递归式问题解决办法:分而治之(divide and conquer,D&C)
- D&C思想:找出简单的基线条件;确定如何缩小问题的规模,使其符合基线条件。
- 涉及数组的递归函数时,基线条件通常是数组为空或只包含一个元素
- 快速排序:取基准值,分区,快排,平均O(nlogn),最差O(n²)
-
def quicksort(array): if len(array) < 2: return array # 基线条件:为空或只包含一个元素的数组是“有序”的 else: pivot = array[0] # 递归条件 less = [i for i in array[1:] if i <= pivot] # 由所有小于基准值的元素组成的子数组 greater = [i for i in array[1:] if i > pivot] # 由所有大于基准值的元素组成的子数组 return quicksort(less) + [pivot] + quicksort(greater) # 返回合并后结果数组
后言
今天就看到这里,看书的时候顺升级了IOS16,锁屏小组件不错,搜索图片文本也更强了,饿了,去吃午饭了,下午刷题和搞毕设!顺带更新几篇昨晚想到的技术帖。