![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
MusicDancing
这个作者很懒,什么都没留下…
展开
-
模拟生产者-消费者模式
利用队列来做同步时是非常简单方便的。1. 简介 queue模块提供了同步的线程安全的队列类,都具有原子性,实现线程间的同步。 Queue: FIFO; LifoQueue: LIFO; PriorityQueue (优先级队列) task_done(): 在使用join()的时候,当queue中所有的项目都被取出,且每个项目取出后都使用了task_done(),那么就可以释放join()阻塞。 用于消费者,每次get()以后,使用task_done() 是...原创 2022-01-29 11:25:02 · 998 阅读 · 0 评论 -
LRU算法实现
1. LRU简介LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”。2. 算法实现2.1 普通实现# 基于普通dict和list实现class LRUCache(object): def __init__(self, size=5): self.size = size self.cache = dict() self原创 2022-01-24 16:00:19 · 1884 阅读 · 0 评论 -
01背包问题(动态规划DP)
01 背包问题是一种典型的Dynamic Programming。问题描述:给定一组物品,其中每种物品都有自己的重量和价格,在限定的总重量内,如何选择才能使物品的总价格最高?一个例子:现有5个商品,质量W(weight)=[2,2,6,5,4];价值V(value)=[3,6,5,4,6],现考虑...原创 2022-01-15 11:37:49 · 183 阅读 · 0 评论 -
最长公共子串与最长公共子序列
1. 最长公共子串要求子串连续,不同于最长公共子序列def LCS(s1, s2): len1, len2 = len(s1), len(s2) # 匹配矩阵,用来记录两个字符串中所有位置的两个字符之间的匹配情况(1:匹配;0:不匹配) c = [[0 for j in range(len2+1)] for i in range(len1+1)] n = 0 # 最长匹配长度 p = 0 # 匹配的结束位置的下一位 for i in range(原创 2022-01-15 11:32:49 · 1001 阅读 · 0 评论 -
数组和为K的组合
1. 求数组中两数相加和为K的所有组合1.1 排序+指针1. 先将数组排序 o(nlogn);2. 再使用两个指针 o(n)。def two_num_sum_k(arr, k): if not arr or len(arr) < 2: return [] result = [] arr.sort() low, high = 0, len(arr) - 1 while low < high: sum =原创 2022-01-15 10:12:15 · 1061 阅读 · 0 评论 -
堆排序与优先级队列
1. 堆排序1.1 堆性质堆是具有以下性质的完全二叉树:1. 每个节点的值都>=其左右孩子的值(大顶堆);2. 每个节点的值都<=其左右孩子的值(小顶堆);1.2 堆排序定义利用堆这种数据结构而设计的排序算法,是一种选择排序。稳定,时间复杂度:最好=平均=最坏=o(nlogn)空间复杂度:o(1)基本思想:将待排序列构造成一个大顶堆,此时整个序列的最大值就是堆顶的根结点。将其与末尾元素进行交换,此时末尾元素就为最大值,然后将剩余n-1个元素重新构造成一原创 2022-01-14 18:01:18 · 218 阅读 · 0 评论 -
快速排序与归并排序
1. 快速排序不稳定,时间复杂度:O(nlogn), 空间复杂度:O(logn)缺点: 对小规模的数据集性能不是很好。通过一趟sort将要排序的data分割成独立的两部分,其中一部分的所有数据比另一部分的所有数据都要小,然后再递归地对这两部分数据进行快排,直到整个待排序列有序。对待排序列A[0],A[1], ..., A[N-1],选取序列的第一个元素(可以是任意元素)作为基准点,然后将所有比它小的数都放到它前面,...原创 2022-01-14 15:24:50 · 871 阅读 · 2 评论 -
一些面试题目汇总
1. Leetcode算法1.1 链表1. 反转、每K个反转(字节最爱)2. 环的入口3. 删除重复节点4. 链表快排/归并排序2.2 动态规划一般记住几个常见的模板就行,如2维dp1. 最长公共子串2. 最长上升子序列3. 换零钱...原创 2021-11-01 10:47:34 · 122 阅读 · 0 评论 -
经典排序--冒泡排序、简单选择排序、直接插入排序
1. 冒泡排序对相邻元素进行两两比较,若逆序则进行交换,每一趟冒泡都会将最小(最大)的元素“浮”到顶端(归位),所以对于n个元素的数组,最多只需n-1趟冒泡,便可达到完全有序。原创 2021-08-11 11:01:35 · 825 阅读 · 0 评论 -
两个排序数组找第K大的数
1. 利用归并排序思想 时间复杂度 o(m+n)def top_k(arr1, arr2, k): if not arr1 or len(arr1) == 0: if not arr2 and len(arr2) >= k: return arr2[len(arr2)-k] return -9999 if not arr2 or len(arr2) == 0: if not arr1 and len(.原创 2021-08-10 21:16:03 · 309 阅读 · 0 评论 -
链表是否有环,是否相交
1. 有环单链表1.1 判断单链表是否有环快慢指针法: 使用两个指针slow,fast同时指向头结点,然后slow每次走一步,fast每次走两步,若二者相遇(指向相同结点),则有环。def is_ring(head): if not head: return False slow = fast = head while fast and fast.next: fast = fast.next.next slow = slo原创 2021-08-10 15:59:29 · 100 阅读 · 0 评论 -
逻辑思维案例题(二)
1. 称重问题现有8个小球,其中一个较重,其余质量相同,另有一天平,问至少要称多少次才能找到质量较大的那个小球? 2次1. 选出6个小球,均分成两组,进行称重;若两边相等,则称一次余下的两个小球即可。2. 否则,在重的那一组选出两个进行称重即可。2.建筑工地上,一个工人在碎石块,一个大石块,每次裂开为两块,n次后,质量最大的那块...原创 2021-08-10 13:15:26 · 606 阅读 · 0 评论 -
数据结构常见排序算法
1.3. 各种排序算法复杂度汇总其中,堆排序属于选择排序。 平均时间 最坏情况 最好情况 辅助存储 稳定性 快排 o(nlogn) o(n^2) o(nlogn) o(logn) 否 堆排序 o(nlogn) o(nlogn) o(nlogn) o(1) 否 归并排序 o(nlogn) o(nlogn) o(nlogn) o(n) 是 简单选择排序 o原创 2021-08-09 14:51:06 · 65 阅读 · 0 评论 -
逻辑思维案例题(概率类)
1. 不使用中间变量交换两个数值假设: a=10, b=201.1 四则运算1.1.1 加减法适用于int与float,但在处理float时有可能出现精度损失。a=a+b;b=a-b;a=a-b;1.1.2 乘除法适用于int与float,但在处理float时有可能出现精度损失,且b!=0。a=a*b;b=a/b;a=a/b;这两种方法都不会产生溢出。以加减法为例,第一步的加法运算可能会造成溢出,但其所造成的溢出会在后边的减运算中被溢出回来。1.2 位异或原创 2021-08-08 00:35:13 · 977 阅读 · 0 评论 -
链表查改增删及反转、合并
1. 定义class ListNode: def __init__(self, x): self.val = x self.next = None1.1 遍历链表def bian_li(head): if not head: print("list is null") return p = head.next while p: print(p.val) p = p.原创 2021-08-04 20:58:37 · 112 阅读 · 0 评论 -
二叉树最近公共父结点
给定结点p,结点q,根结点root,求p,q的最近公共父结点。1. p,q位于root的两侧,---> root;2. p,q同时位于root的左、右子树 ---> 左、右子树返回的非空值。原创 2021-08-03 15:54:28 · 130 阅读 · 0 评论 -
镜像二叉树、平衡二叉树、二叉搜索树
1. 镜像二叉树2.平衡二叉树3. 二叉搜索树原创 2021-08-03 12:49:39 · 187 阅读 · 0 评论 -
二叉树遍历及变形
1. 定义class TreeNode: def __init__(self, val=None, left=None, right=None): self.val = val self.left = left self.right = right2. 遍历2.1 先序遍历2.1.1 递归2.1.2 非递归2.3 中序遍历2.1.1 递归2.1.2 非递归2.1 后序遍历2.1.1 递归2.1.2 非递归原创 2021-08-02 20:58:37 · 185 阅读 · 0 评论 -
常见二叉树汇总
Binary Search Tree, 又称二叉搜索树。它或是一颗空树或是具有如下性质的二叉树:1. 若左子树不空,则左子树上所有结点的值均<=它根结点的值;2. 若右子树不空,则右子树上所有结点的值均>=它根结点的值;3. 它的左右子树也分别为BST。一个无序序列可以通过构造一棵BST变成一个有序序列(中序遍历BST可以得到一个关键字的有序序列),构造树的过程即为对无序序列进行排序的过程。其搜索、插入、排序的时间复杂度=树高=o(log(n))二叉树性质:原创 2021-08-01 16:33:02 · 419 阅读 · 0 评论 -
哈希处理冲突方法
1. 开放定址法(1)线性探测再散列;(2)二次探测再散列;(3)随机探测再散列;2. 再哈希3. 链地址4. 建立一个公共溢出区原创 2021-08-01 11:54:14 · 73 阅读 · 0 评论