【算法图解】阅读笔记Day1

前言

昨天开始看《算法图解》,虽然之前自学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,锁屏小组件不错,搜索图片文本也更强了,饿了,去吃午饭了,下午刷题和搞毕设!顺带更新几篇昨晚想到的技术帖。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值