分类:N05_python
序号 | 目录 | 时间 | 备注 |
P1 | 01 算法入门概念 | 06:42 | 2024-03-06 |
P2 | 02 估算法运行效率与时间复杂度 | 17:05 | 2024-03-06 |
P3 | 03 简单判断时间复杂度 | 01:33 | 2024-03-06 |
P4 | 04 空间复杂度 | 03:03 | 2024-03-06 |
P5 | 05 递归 | 06:06 | 2024-03-06 |
P6 | 06 汉诺塔问题 | 15:41 | def hanoi(n, a, b, c): if n>0: hanoi(n-1, a, c, b) print("moving from %s to %s" % (a, c)) hanoi(n-1, b, a, c) |
P7 | 07 顺序查找 | 04:25 | def linear_search(li, val): for ind, v in enumerate(li): if v==val: return ind else: return None |
P8 | 09二分查找介绍 | 10:03 | |
P9 | 10二分查找代码 | 04:44 | # 二分查找 def binary_search(li, val): left = 0 right = len(li)-1 while left <= right: mid = (left+right)//2 if li[mid] == val: return mid elif li[mid] > val: left = mid - 1 else: right = mid + 1 else: return None li = [1, 3, 5, 6, 7, 9] print(binary_search(li, 5) |
P10 | 11二分查找与线性查找的比较 | 11:35 | |
P11 | 12排序介绍 | 02:30 | |
P12 | 13冒泡排序介绍 | 07:42 | # 冒泡排序 def bubble_sort(li): for i in range(len(li)-1): exchange = False for j in range(len(li)-1-i): if li[j] > li[j+1]: li[j], li[j+1] = li[j+1], li[j] exchange = True if not exchange: return li return li li = [9, 1, 5, 6, 8, 4, 2] print(li) print(bubble_sort(li) |
P13 | 14冒泡排序 | 10:12 | |
P14 | 15选择排序 | 18:13 | # 选择排序 def select_sort(li): for i in range(len(li)-1): min_loc = i for j in range(i+1, len(li)): if li[j] < li[min_loc]: min_loc =j li[i], li[min_loc] = li[min_loc], li[i] return li |
P15 | 16插入排序 | 19:04 | # 插入排序 def insert_sort(li): for i in range(1, len(li)): tmp = li[i] # 选择的要插入的牌 j = i-1 # 手里已经排好序的牌的前一张 while j>=0 and tmp<li[j]: li[j+1] = li[j] j -= 1 li[j+1] = tmp print(li) return li li = [4, 8, 0, 1, 5, 7] print(li) print(insert_sort(li) |
P16 | 17快速排序原理介绍 | 10:47 | |
P17 | 18快速排序代码实现 | 20:52 | # 快排的归为操作 def partition(li, left, right): print('kaishi') tmp = li[left] while left<right: # 先从右边开始找 while li[right] >= tmp and left<right: right -= 1 li[left] = li[right] # 再从左边开始找 while left<right and li[left] <= tmp: left += 1 li[right] = li[left] li[left] = tmp print(li) print(li) partition(li, 0, len(li)-1 |
P18 | 19快速排序代码实现2 | 17:43 | def partition(li, left, right): tmp = li[left] while left < right: while left < right and li[right] >= tmp: #从右面找比tmp小的数 right -= 1 # 往左走一步 li[left] = li[right] #把右边的值写到左边空位上 # print(li, 'right') while left < right and li[left] <= tmp: left += 1 li[right] = li[left] #把左边的值写到右边空位上 # print(li, 'left') li[left] = tmp # 把tmp归位 return left def _quick_sort(li, left, right): if left<right: # 至少两个元素 mid = partition(li, left, right) _quick_sort(li, left, mid-1) _quick_sort(li, mid+1, right) @cal_time def quick_sort(li): _quick_sort(li, 0, len(li)-1) li = list(range(10000, 0, -1)) # random.shuffle(li) # # li1 = copy.deepcopy(li) # li2 = copy.deepcopy(li) # quick_sort(li) # bubble_sort(li2) # # print(li1) # print(li2) # li = [9,8,7,6,5,4,3,2,1] # partition(li, 0, len(li)-1) # print(li |
P19 | 20堆排序前传树的基础知识 | 05:33 | |
P20 | 21堆排序前传二叉树的基础知识 | 10:22 | |
P21 | 22堆排序前传堆和堆的向下调整 | 07:31 | |
P22 | 23堆排序的过程演示 | 10:52 | |
P23 | 24向下调整函数的实现 | 26:06 | def sift(li, low, high): """ :param li: 列表 :param low: 堆的根节点位置 :param high: 堆的最后一个元素的位置 :return: """ i = low # i最开始指向根节点 j = 2 * i + 1 # j开始是左孩子 tmp = li[low] # 把堆顶存起来 while j <= high: # 只要j位置有数 if j + 1 <= high and li[j+1] > li[j]: # 如果右孩子有并且比较大 j = j + 1 # j指向右孩子 if li[j] > tmp: li[i] = li[j] i = j # 往下看一层 j = 2 * i + 1 else: # tmp更大,把tmp放到i的位置上 li[i] = tmp # 把tmp放到某一级领导位置上 break else: li[i] = tmp # 把tmp放到叶子节点 |
P24 | 25堆排序的实现(1) | 11:34 | def heap_sort(li): n = len(li) for i in range((n-2)//2, -1, -1): # i表示建堆的时候调整的部分的根的下标 sift(li, i, n-1) # 建堆完成了 for i in range(n-1, -1, -1): # i 指向当前堆的最后一个元素 li[0], li[i] = li[i], li[0] sift(li, 0, i - 1) #i-1是新的high li = [i for i in range(100)] import random random.shuffle(li) print(li) heap_sort(li) print(li |
P25 | 26堆排序的实现(2) | 06:45 | |
P26 | 27堆排序的时间复杂度 | 02:06 | |
P27 | 28堆的内置模块 | 06:23 | |
P28 | 29topk问题 | 10:53 | |
P29 | 30topk实现 | 08:22 | def topk(li, k): heap = li[0:k] for i in range((k-2)//2, -1, -1): sift(heap, i, k-1) # 1.建堆 for i in range(k, len(li)-1): if li[i] > heap[0]: heap[0] = li[i] sift(heap, 0, k-1) # 2.遍历 for i in range(k-1, -1, -1): heap[0], heap[i] = heap[i], heap[0] sift(heap, 0, i - 1) # 3.出数 return heap import random li = list(range(1000)) random.shuffle(li) print(topk(li, 10) |
P30 | 31归并排序实现 | 11:48 | |
P31 | 32归并排序归并 | 11:11 | |
P32 | 33归并排序复杂度讨论 | 03:34 | |
P33 | 34NB三人组小结 | 12:28 | |
P34 | 35希尔排序 | 10:31 | |
P35 | 36希尔排序讨论 | 04:13 | |
P36 | 37计数排序 | 13:24 | |
P37 | 38桶排序介绍 | 04:59 | |
P38 | 39桶排序实现 | 19:48 | |
P39 | 40基数排序介绍 | 09:12 | |
P40 | 41基数排序实现 | 23:39 | |
P41 | 42查找排序部分习题 | 06:12 | |
P42 | 43查找排序习题1 | 11:17 | |
P43 | 44查找排序习题2 | 15:08 | |
P44 | 45查找排序习题3 | 17:00 | |
P45 | 46查找排序习题4 | 08:39 | |
P46 | 47数据结构介绍 | 06:37 | |
P47 | 48列表 | 17:44 | |
P48 | 49栈的介绍 | 08:04 | |
P49 | 50栈的应用:括号匹配问题 | 14:58 | |
P50 | 51队列的介绍 | 15:56 | |
P51 | 52队列的实现 | 12:17 | |
P52 | 53队列的内置模块 | 12:04 | |
P53 | 54栈和队列的应用:迷宫问题 | 07:42 | |
P54 | 55使用栈解决迷宫问题 | 14:03 | |
P55 | 56队列进行迷宫问题:介绍 | 12:25 | |
P56 | 57队列进行迷宫问题:实现 | 16:52 | |
P57 | 58 链表介绍 | 04:30 | |
P58 | 59 链表创建和遍历 | 08:45 | |
P59 | 60 链表的插入和删除 | 04:49 | |
P60 | 61 双链表 | 03:13 | |
P61 | 62 链表总结 | 04:25 | class Node: def __init__(self, item): self.item = item self.next = None def create_linklist_tail(li): head = Node(li[0]) tail = head for element in li[1:]: node = Node(element) tail.next = node tail = node return head def print_linklist(lk): while lk: print(lk.item, end=",") lk = lk.next li = [1, 2, 3, 4, 6] lk = create_linklist_tail(li) print_linklist(lk) |
P62 | 63 哈希表 | 20:59 | |
P63 | 64 哈希表实现 | 16:10 | |
P64 | 65 哈希表应用 | 12:18 | |
P65 | 66 树的概念 | 04:09 | |
P66 | 67 树的实例:模拟文件系统 | 18:22 | |
P67 | 68 二叉树的概念 | 05:14 | |
P68 | 69 二叉树的遍历 | 17:35 | |
P69 | 70 二叉搜索树的概念 | 04:33 | |
P70 | 71 二叉搜索树:插入 | 15:59 | |
P71 | 72 二叉搜索树:查询 | 05:11 | |
P72 | 73 二叉搜索树:删除 | 04:21 | |
P73 | 74 二叉搜索树:删除实现 | 22:47 | |
P74 | 75 AVL树的概念 | 06:26 | |
P75 | 76 AVL:旋转 | 11:01 | |
P76 | 77 AVL:旋转实现1 | 12:24 | |
P77 | 78 AVL:旋转实现2 | 17:30 | |
P78 | 80 AVL:插入 | 42:06 | |
P79 | 81 AVL树应用与数据结构总结 | 11:46 | |
P80 | 83 贪心算法(算法进阶) | 09:14 | |
P81 | 84 分数背包 | 08:23 | |
P82 | 85 分数背包实现 | 13:07 | |
P83 | 86 数字拼接问题 | 06:18 | |
P84 | 87 数字拼接问题实现 | 06:49 | # 数字拼接问题 from functools import cmp_to_key li = [32, 94, 128, 1286, 6, 71] def xy_cmp(x, y): if x+y < y+x: return 1 elif x+y > y+x: return -1 else: return 0 def number_join(li): li = list(map(str, li)) print(li) li.sort(key=cmp_to_key(xy_cmp)) return "".join(li) print(number_join(li) |
P85 | 88 活动选择问题 | 06:33 | |
P86 | 89 活动选择问题实现 | 05:23 | |
P87 | 90 贪心算法总结 | 03:22 | |
P88 | 91 动态规划介绍 | 13:56 | |
P89 | 92 钢条切割问题 | 24:39 | |
P90 | 93 问题:自顶向下实现 | 15:18 | |
P91 | 94 问题:自底向上实现 | 09:48 | |
P92 | 95 钢条切割问题:重构解 | 21:08 | |
P93 | 96 最长公共子序列 | 22:25 | |
P94 | 97 最长公共子序列:实现 | 29:03 | |
P95 | 98 欧几里得算法 | 19:02 | |
P96 | 99 RSA算法介绍 | 07:23 | |
P97 | 100 RSA算法测试 | 09:51 | |
P98 | 101 算法课程总结 | 05:29 | |
P99 | 1 设计模式与面向对象介绍 | 26:55 | |
P100 | 2 面向对象设计原则 | 21:42 | |
P101 | 3 简单工厂模式 | 12:39 | |
P102 | 4 工厂方法模式 | 08:39 | |
P103 | 5 抽象工厂模式 | 13:22 | |
P104 | 6 建造者模式 | 15:40 | |
P105 | 7 单例模式 | 12:05 | |
P106 | 8 适配器模式 | 11:54 | |
P107 | 9 桥模式 | 18:50 | |
P108 | 10 组合模式 | 17:23 |