自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

茹泽伟的博客

图像处理

  • 博客(78)
  • 收藏
  • 关注

原创 MySQL 初学

找到账户密码:sudo cat /etc/mysql/debian.cnf登录:mysql -u debian-sys-maint -pBpFNW2rSuFwaGRzq

2022-05-16 14:05:50 227

原创 如何使用鼠标抓取像素位置

import matplotlib.pyplot as pltimport matplotlib.image as mpimgimg = mpimg.imread('your_image.png')imgplot = plt.imshow(img)plt.show()

2022-03-21 17:29:48 469

原创 剑指Offer:字符串的排列

class Solution: def permuteUnique(self, nums: List[int]) -> List[List[int]]: # res用来存放结果 if not nums: return [] res = [] used = [0] * len(nums) def backtracking(nums, used, path): # 终止条件 .

2021-08-14 15:48:14 190

原创 剑指Offer:构建乘积数组

Python Reduce (out of time)class Solution(object): def constructArr(self, a): """ :type a: List[int] :rtype: List[int] """ B = [] if len(a) == 0: return B else: for i in

2021-08-13 22:40:14 89

原创 剑指Offer:数组中重复的数字

class Solution(object): def findRepeatNumber(self, nums): """ :type nums: List[int] :rtype: int """ num_dict = dict() for x in nums: if x not in num_dict: num_dict[x] = 1 .

2021-08-13 22:00:35 53

原创 剑指 Offer II 004. 只出现一次的数字

字典法class Solution(object): def singleNumber(self, nums): """ :type nums: List[int] :rtype: int """ num_dict = dict() for x in nums: if x in num_dict: num_dict[x] += 1

2021-08-13 21:32:09 117

原创 剑指Offer:数组中只出现一次的数字

位运算class Solution(object): def singleNonDuplicate(self, nums): """ :type nums: List[int] :rtype: int """ n = 0 for x in nums: n ^= x return n二分法class Solution(object): def

2021-08-13 20:53:08 43

原创 剑指Offer:数字在排序数组中出现的次数

class Solution(object): def singleNumbers(self, nums): """ :type nums: List[int] :rtype: List[int] """ x, y, n, m = 0, 0, 0, 1 for item in nums: n ^= item while n & m == 0: .

2021-08-13 19:10:45 64

原创 剑指Offer:数组中的逆序对

class Solution(object): def reversePairs(self, nums): """ :type nums: List[int] :rtype: int """ if len(nums) <= 1: return 0 temp = [x for x in nums] return self.mergeSort(temp, num.

2021-08-13 12:50:15 71

原创 剑指Offer:把数组排成最小的数

class Solution(object): def minNumber(self, nums): """ :type nums: List[int] :rtype: str """ if len(nums) == 0: return None compare = lambda a, b : cmp(str(a) + str(b), str(b) + str(a)) .

2021-08-12 16:53:08 48

原创 剑指Offer:连续子数组的最大和

class Solution(object): def maxSubArray(self, nums): """ :type nums: List[int] :rtype: int """ sub_sum = nums[0] max_sum = nums[0] for i in range(1, len(nums)): if sub_sum < 0: .

2021-08-12 14:55:16 53

原创 剑指Offer:数组中出现次数超过一半的数字

class Solution(object): def majorityElement(self, nums): """ :type nums: List[int] :rtype: int """ thresh = len(nums) // 2 cnt_dict = dict() for i in range(len(nums)): if nums[i] in...

2021-08-11 17:18:33 53

原创 剑指Offer:调整数组顺序使奇数位于偶数前面

Brutal Forceclass Solution(object): def exchange(self, nums): """ :type nums: List[int] :rtype: List[int] """ res = [] length = len(nums) for i in range(length): if nums[i] % 2 == 1

2021-08-11 16:53:39 58

原创 剑指Offer:旋转数组的最小数字

Brutal Forceclass Solution(object): def minArray(self, numbers): """ :type numbers: List[int] :rtype: int """ if len(numbers) == 0: return None if len(numbers) == 1: return numb

2021-08-11 14:49:51 51

原创 Python实现NMS

import numpy as npimport matplotlib.pyplot as pltboxes = np.array([[100, 100, 210, 210, 0.72], [250, 250, 420, 420, 0.8], [220, 220, 320, 330, 0.92], [100, 100, 210, 210, 0.72], [2.

2021-08-11 10:25:22 883

原创 用numpy计算IOU

import numpy as npbox1 = np.array([[10, 10, 50, 50], [70, 70, 120, 120]])box2 = np.array([[10, 10, 50, 50], [100, 100, 150, 150], [80, 80, 160, 160], [130, 130, 200, 200]])def iou_matc.

2021-08-10 15:52:38 1565

原创 剑指Offer:二维数组中的查找

Brutal Forceclass Solution(object): def findNumberIn2DArray(self, matrix, target): """ :type matrix: List[List[int]] :type target: int :rtype: bool """ res = False row_num = len(matrix)

2021-08-05 19:46:37 71

原创 数据结构定义和算法--动态规划

适应场景“一个模型三个特征”一个模型多阶段决策最优解模型:问题的解决需要多个阶段,每个阶段对应一组相应状态,然后寻求一组决策序列,通过该决策序列可以得到最优解。三个特征最优子结构:最优子结构指的是,问题的最优解包含子问题的最优解。反过来说就是,我们可以通过子问题的最优解,推导出问题的最优解。如果我们把最优子结构,对应到我们前面定义的动态规划问题模型上,那我们也可以理解为,后面阶段的状态可以通过前面阶段的状态推导出来。无后效性:无后效性有两层含义,第一层含义是,在推导后面阶段的状态的.

2021-07-29 17:38:37 171

原创 数据结构定义和算法--贪心算法

实例分糖果 钱币找零 区间覆盖算法步骤当我们看到这类问题的时候,首先要联想到贪心算法:针对一组数据,我们定义了限制值和期望值,希望从中选出几个数据,在满足限制值的情况下,期望值最大。 我们尝试看下这个问题是否可以用贪心算法解决:每次选择当前情况下,在对限制值同等贡献量的情况下,对期望值贡献最大的数据。 我们举几个例子看下贪心算法产生的结果是否是最优的。大部分情况下,举几个例子验证一下就可以了。有时候失效在一个有权图中,我们从顶点 S 开始,找一条到顶点 T 的最短路径(路径中边的权值

2021-06-30 20:53:56 162 2

原创 shell 脚本激活 conda 环境

在 shell 脚本中激活 conda 环境时,往往会遇见如下问题:

2021-06-08 19:36:52 1377 1

原创 数据结构定义和算法--AC自动机

定义AC 自动机实际上就是在 Trie 树之上,加了类似 KMP 的 next 数组,只不过此处的 next 数组是构建在树上罢了。构建AC 自动机包含两个操作:将多个模式串构建成 Trie 树; 在 Trie 树上构建失败指针(相当于 KMP 中的失效函数 next 数组)。下面链接讲得更加清晰:https://www.bilibili.com/medialist/play/ml1213813670/BV1uJ411Y7Eg复杂度分析构建Trie树Trie 树构建.

2021-04-06 20:51:06 161

原创 数据结构定义和算法--Trie 树

什么是“Trie 树”?Trie 树,也叫“字典树”。顾名思义,它是一个树形结构。它是一种专门处理字符串匹配的数据结构,用来解决在一组字符串集合中快速查找某个字符串的问题。Trie 树的本质,就是利用字符串之间的公共前缀,将重复的前缀合并在一起。如何实现一棵 Trie 树?Trie 树主要有两个操作,一个是将字符串集合构造成 Trie 树。这个过程分解开来的话,就是一个将字符串插入到 Trie 树的过程。另一个是在 Trie 树中查询一个字符串。存储一个 Trie 树:时间复杂度

2021-03-25 21:44:30 105

原创 数据结构定义和算法--字符串匹配KMP算法

KMP 算法基本原理KMP 算法是根据三位作者(D.E.Knuth,J.H.Morris 和 V.R.Pratt)的名字来命名的,算法的全称是 Knuth Morris Pratt 算法,简称为 KMP 算法。在模式串和主串匹配的过程中,把不能匹配的那个字符仍然叫作坏字符,把已经匹配的那段字符串叫作好前缀。KMP 算法就是在试图寻找一种规律:在模式串和主串匹配的过程中,当遇到坏字符后,对于已经比对过的好前缀,能否找到一种规律,将模式串一次性滑动很多位?好前缀的所有后缀子串中,最长的可

2021-03-24 22:07:21 175

原创 数据结构定义和算法--字符串匹配BM算法

《数据结构与算法之美》 -- 王争

2021-03-17 22:16:31 258

原创 数据结构定义和算法--字符串匹配BF&RK算法

BF 算法BF 算法中的 BF 是 Brute Force 的缩写,也叫朴素匹配算法。用一句话来概括,那就是,我们在主串中,检查起始位置分别是 0、1、2....n-m 且长度为 m 的 n-m+1 个子串,看有没有跟模式串匹配的。在极端情况下,我们每次都比对 m 个字符,要比对 n-m+1 次,所以,这种算法的最坏情况时间复杂度是 O(n*m)。但在实际的开发中,它却是一个比较常用的字符串匹配算法。原因有两点:第一,实际的软件开发中,大部分情况下,模式串和主串的长度都不会太长。大部分情况.

2021-03-17 21:52:13 130

原创 数据结构定义和算法--深度和广度优先搜索

深度优先搜索算法和广度优先搜索算法,既可以用在无向图,也可以用在有向图上。广度优先搜索(BFS)广度优先搜索(Breadth-First-Search),我们平常都简称 BFS。直观地讲,它其实就是一种“地毯式”层层推进的搜索策略。每个顶点都要进出一遍队列,每个边也都会被访问一次,所以,广度优先搜索的时间复杂度是 O(V+E),其中,V 表示顶点的个数,E 表示边的个数。当然,对于一个连通图来说,也就是说一个图中的所有顶点都是连通的,E 肯定要大于等于 V-1,所以,..

2021-03-16 22:13:28 390

原创 数据结构定义和算法--图的表示

无向图没有方向的图就叫做“无向图”。图中的元素我们就叫做顶点(vertex) 图中的一个顶点可以与任意其他顶点建立连接关系,这种建立的关系叫做边(edge) 顶点相连接的边的条数叫做度(degree)有向图边有方向的图叫做“有向图”。顶点的入度(In-degree),表示有多少条边指向这个顶点 顶点的出度(Out-degree),表示有多少条边是以这个顶点为起点指向其他顶点 对应到微博的例子,入度就表示有多少粉丝,出度就表示关注了多少人。带权图每条边都有一个权重(we

2021-03-16 21:32:34 343

原创 数据结构定义和算法--堆的应用

优先级队列用堆来实现是最直接、最高效的,一个堆就可以看作一个优先级队列。很多时候,它们只是概念上的区分而已。往优先级队列中插入一个元素,就相当于往堆中插入一个元素;从优先级队列中取出优先级最高的元素,就相当于取出堆顶元素。合并有序小文件假设我们有 100 个小文件,每个文件的大小是 100MB,每个文件中存储的都是有序的字符串。我们希望将这些 100 个小文件合并成一个有序的大文件。这里就会用到优先级队列。我们将从小文件中取出来的字符串放入到小顶堆中,那堆顶的元素,也就是优先级队列队首的元素

2021-03-15 18:37:56 143

原创 数据结构定义和算法--堆和堆排序

什么是堆?堆是一个完全二叉树; 堆中每一个节点的值都必须大于等于(或小于等于)其子树中每个节点的值。 那如果从 0 开始存储,节点的下标是 i,那左子节点的下标就是 2∗i+1,右子节点的下标就是 2∗i+2,父节点的下标就是 (i−1​)/2。(会多一次加法运算)堆的操作插入一个元素我们可以让新插入的节点与父节点对比大小。如果不满足子节点小于等于父节点的大小关系,我们就互换两个节点。一直重复这个过程,直到父子节点之间满足刚说的那种大小关系。删除堆顶元素当我们删..

2021-03-13 11:52:32 148

原创 数据结构定义和算法--递归树

快速排序的时间复杂度我们假设平均情况下,每次分区之后,两个分区的大小比例为 1:k。当 k=9 时,如果用递推公式的方法来求解时间复杂度的话,递推公式就写成 T(n)=T(10n​)+T(109n​)+n。我们知道,快速排序结束的条件就是待排序的小区间,大小为 1,也就是说叶子节点里的数据规模是 1。从根节点 n 到叶子节点 1,递归树中最短的一个路径每次都乘以 101​,最长的一个路径每次都乘以 109​。通过计算,我们可以得到,从根节点到叶子节点的最短路径是 log10​n,最长的路径是 l

2021-01-22 16:00:06 191 3

原创 数据结构定义和算法--红黑树(下)

红黑树条件根节点是黑色的; 每个叶子节点都是黑色的空节点(NIL),也就是说,叶子节点不存储数据; 任何相邻的节点都不能同时为红色,也就是说,红色节点是被黑色节点隔开的; 每个节点,从该节点到达其可达叶子节点的所有路径,都包含相同数目的黑色节点。在插入、删除节点的过程中,第三、第四点要求可能会被破坏,而我们今天要讲的“平衡调整”,实际上就是要把被破坏的第三、第四点恢复过来。左旋和右旋左旋全称其实是叫围绕某个节点的左旋,那右旋的全称估计你已经猜到了,就叫围绕某个节点的右旋。插.

2021-01-21 19:58:56 158

原创 数据结构定义和算法--红黑树(上)

什么是“平衡二叉查找树”?二叉树中任意一个节点的左右子树的高度相差不能大于 1。从这个定义来看,完全二叉树、满二叉树其实都是平衡二叉树,但是非完全二叉树也有可能是平衡二叉树。解决的问题解决普通二叉查找树在频繁的插入、删除等动态更新的情况下,出现时间复杂度退化的问题。平衡的真实含义平衡二叉查找树中“平衡”的意思,其实就是让整棵树左右看起来比较“对称”、比较“平衡”,不要出现左子树很高、右子树很矮的情况。这样就能让整棵树的高度相对来说低一些,相应的插入、删除、查找等操作的效率高一些。如何

2021-01-21 15:40:30 145

原创 数据结构定义和算法--二叉树基础(下)

二叉查找树(Binary Search Tree)定义:二叉查找树要求,在树中的任意一个节点,其左子树中的每个节点的值,都要小于这个节点的值,而右子树节点的值都大于这个节点的值。二叉查找树查找操作我们先取根节点,如果它等于我们要查找的数据,那就返回。如果要查找的数据比根节点的值小,那就在左子树中递归查找;如果要查找的数据比根节点的值大,那就在右子树中递归查找。二叉查找树插入操作如果要插入的数据比节点的数据大,并且节点的右子树为空,就将新数据直接插到右子节点的位置;如果不为空,就再递归

2021-01-20 22:25:49 49

原创 数据结构定义和算法--二叉树基础(上)

树的常用概念根节点、叶子节点、父节点、子节点、兄弟节点,还有节点的高度、深度以及层数,树的高度。比如下面这幅图,A 节点就是 B 节点的父节点,B 节点是 A 节点的子节点。B、C、D 这三个节点的父节点是同一个节点,所以它们之间互称为兄弟节点。我们把没有父节点的节点叫做根节点,也就是图中的节点 E。我们把没有子节点的节点叫做叶子节点或者叶节点,比如图中的 G、H、I、J、K、L 都是叶子节点。二叉树二叉树:每个节点最多只有2个子节点的树,这两个节点分别是左子节点和右子节点。

2021-01-19 22:33:11 112

原创 数据结构定义和算法--哈希算法(下)

哈希算法在分布式系统中的应用负载均衡需求描述:如何实现一个会话粘滞(session sticky)的负载均衡算法?也就是说,在一次会话中的所有请求都路由到同一个服务器上。解决方案:通过哈希算法对客户端IP或会话ID计算哈希值,将取得的哈希值与服务器列表的大小进行取模运算,最终得到的值就是应该被路由到的服务器编号。这样,就可以把同一个IP过来的请求都路由到同一个后端服务器上。数据分片需求描述一:假如我们有1T的日志文件,这里面记录了用户的搜索关键词,我们想要快速统计出每个关键词被搜索的次数

2021-01-18 20:44:10 69

原创 数据结构定义和算法--哈希算法(上)

哈希算法定义将任意长度的二进制值串映射成固定长度的二进制值串,这个映射的规则就是哈希算法,而通过原始数据映射之后得到的二进制值串就是哈希值。哈希算法特点单向哈希:从哈希值不能反向推导出原始数据(所以哈希算法也叫单向哈希算法) 篡改无效:对输入敏感,哪怕原始数据只修改一个Bit,最后得到的哈希值也大不相同 散列冲突:散列冲突的概率要很小,对于不同的原始数据,哈希值相同的概率非常小 执行效率:哈希算法的执行效率要尽量高效,针对较长的文本,也能快速计算哈希值哈希算法常见应用7个常见应用:安

2021-01-18 20:09:05 106

原创 数据结构定义和算法--散列表(下)

为什么散列表和链表经常放在一起使用?散列表的优点:支持高效的数据插入、删除和查找操作 散列表的缺点:不支持快速顺序遍历散列表中的数据 如何按照顺序快速遍历散列表的数据?只能将数据转移到数组,然后排序,最后再遍历数据。 我们知道散列表是动态的数据结构,需要频繁的插入和删除数据,那么每次顺序遍历之前都需要先排序,这势必会造成效率非常低下。 如何解决上面的问题呢?就是将散列表和链表(或跳表)结合起来使用。散列表和链表如何组合起来使用?LRU(Least Recently Used)缓存淘汰算

2021-01-16 21:50:11 76

原创 数据结构定义和算法--散列表(中)

工业级的散列表支持快速的查询、插入、删除操作; 内存占用合理,不能浪费过多空间; 性能稳定,在极端情况下,散列表的性能也不会退化到无法接受的情况。如何设计这样一个散列表呢设计一个合适的散列函数; 定义装载因子阈值,并且设计动态扩容策略; 选择合适的散列冲突解决方法。如何设计散列函数要尽可能让散列后的值随机且均匀分布,这样会尽可能减少散列冲突,即便冲突之后,分配到每个槽内的数据也比较均匀。 除此之外,散列函数的设计也不能太复杂,太复杂就会太耗时间,也会影响到散列表的性能。 常见的散

2021-01-16 16:55:02 79

原创 数据结构定义和算法--散列表(上)

散列表的由来1.散列表来源于数组,它借助散列函数对数组这种数据结构进行扩展,利用的是数组支持按照下标随机访问元素的特性。2.需要存储在散列表中的数据我们称为键,将键转化为数组下标的方法称为散列函数,散列函数的计算结果称为散列值。3.将数据存储在散列值对应的数组下标位置。如何设计散列函数总结3点设计散列函数的基本要求1.散列函数计算得到的散列值是一个非负整数2.若key1=key2,则hash(key1)=hash(key2)3.若key≠key2,则hash(key1)≠has

2021-01-16 14:40:01 149

原创 数据结构定义和算法--跳表

定义如下图所示,为链表建立多级索引的数据结构就称为跳表。时间复杂度假设索引有 h 级,最高级的索引有 2 个结点。通过公式,我们可以得到 n/(2^h)=2,从而求得 h=logn-1。如果包含原始链表这一层,整个跳表的高度就是 logn。我们在跳表中查询某个数据的时候,如果每一层都要遍历 m 个结点,那在跳表中查询一个数据的时间复杂度就是 O(m*logn)。假设我们要查找的数据是 x,在第 k 级索引中,我们遍历到 y 结点之后,发现 x 大于 y,小于后面的结点 z,所以我们通过 y

2021-01-15 22:53:45 131

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除