![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法随笔
有dian意思
这个作者很懒,什么都没留下…
展开
-
Python字符串中含有某子字符串的个数
str1 = "abskfirgnlskgabndf"str2 = "ab"num = (len(str1) - len(str1.replace(str2,""))) // len(str2)原创 2020-09-08 08:25:58 · 1661 阅读 · 0 评论 -
并查集(Union-Find)
并查集(Union-Find)是解决动态连通性问题的一类非常高效的数据结构。本文中,我将尽我所能用最简单,最清晰的逻辑展示出并查集的构造过程,同时还将对其中的关键步骤给出相应的Python代码。动态连通性可以想象一张地图上有很多点,有些点之间是有道路相互联通的,而有些点则没有。如果我们现在要从点A走向点B,那么一个关键的问题就是判断我们能否从A走到B呢?换句话说,A和B是否是连通的。这是动态连通性最基本的诉求。现在给出一组数据,其中每个元素都是一对“点”,代表这对点之间是联通的,我们需要设计一个算法,让转载 2020-05-15 15:34:56 · 745 阅读 · 0 评论 -
面试题53 - II. 0~n-1中缺失的数字(二分变种)
一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。示例 2:输入: [0,1,2,3,4,5,6,7,9]输出: 8排序数组中的搜索问题,首先想到 二分法 解决。根据题意,数组可以按照以下规则划分为两部分。左子数组:nums[i]=inums[i]nums[i] = in...原创 2020-03-20 22:25:18 · 162 阅读 · 0 评论 -
面试题53 - I. 在排序数组中查找数字 I(二分查找上下界问题)
统计一个数字在排序数组中出现的次数。思路:二分查找具体思考过程见注释def search_left_right(alist, target): i, j = 0, len(alist) - 1 # 查找右边界 while i <= j: mid = i + (j - i) // 2 if alist[mid] <= targ...原创 2020-03-20 20:20:12 · 166 阅读 · 0 评论 -
希尔排序
插入排序的比对次数,在最好的情况下是O(n),这种情况发生在列表已是有序的情况下,实际上,列表越接近有序,插入排序的比对次数就越少从这个情况分析,希尔排序以插入排序作为基础,对无序表进行“间隔”划分子列表,每个子列表都执行插入排序最后一趟是标准的插入排序,但由于前面几趟已经将列表处理到接近有序,这一趟仅需少数几次移动即可完成子列表的间隔一般从n/2开始,每趟倍增:n/4, n/8,…,1d...原创 2020-03-20 18:09:20 · 102 阅读 · 0 评论 -
插入排序及python实现
假设数列第一个元素为已排序数列,剩余数列为未排序将待排序元素挨个插入到已排序数列中每次插入都必须保证数列是有序的,即通过比较和移动有序数列中的元素,将元素插入到合适的位置。插入排序维持一个已排好序的子列表,其位置始终在列表的前部,然后逐步扩大这个子列表直至全表思路:如同玩扑克牌一样,每次摸牌都将它与手中的牌比较,始终将牌放在比它大的牌前面,比它小的牌后面。这样当牌全部摸到手上后,就是一个有序的...原创 2020-03-20 17:38:41 · 203 阅读 · 0 评论 -
冒泡和选择排序算法
冒泡排序时间复杂度O(n2)O(n^2)O(n2)冒泡排序的算法思路在于对无序表进行多趟比较交换每趟包括了多次亮亮相邻比较,并将逆序的数据项互换位置,最终能将本趟的最大项就位经过n-1趟比较交换,实现整表排序每趟的过程类似于“气泡”在水中不断上浮到水面的过程具体过程:第1趟比较交换,共有n-1对相邻数据进行比较(一旦经过最大项,则最大项会一路交换到达最后一项);第2趟比较交换...原创 2020-03-20 16:28:26 · 92 阅读 · 0 评论 -
二分查找及python实现
二分查找适合对于有序表的查找每次通过与区间的中间元素对比,将待查找的区间缩小为之前的一半,直到找到要查找的元素,或者区间被缩小为0时间复杂度就是O(logn)// 表示整数除法,返回一个不大于" / "计算结果的最大整数int(即为下取整)def binarySearch(nums, target): if len(nums) == 0: return False...原创 2020-03-20 15:50:59 · 95 阅读 · 0 评论 -
快速排序python实现
快速排序的思路是依据一个中值数据项来吧数据表分成两半:小于中值的一半和大于中值的一半,然后每部分分别进行快速排序(递归)递归三要素:基本结束条件:数据表仅有1个数据项缩小规模:根据中值,将数据表分为两半,最好情况是相等规模的两半调用自身:将两半分别调用自身进行排序(排序基本操作在分裂过程中)分裂数据表的目标:找到中值的位置分裂数据表的手段:设置左右标(left / rig...原创 2020-03-19 21:59:42 · 353 阅读 · 0 评论 -
B树(B-Tree)与B+树
注意:首先需要说明的一点是:B-树就是B树,没有所谓的B减树引言 我们都知道二叉查找树的查找的时间复杂度是O(log N),其查找效率已经足够高了,那为什么还有B树和B+树的出现呢?难道它两的时间复杂度比二叉查找树还小吗? 答案当然不是,B树和B+树的出现是因为另外一个问题,那就是磁盘IO;众所周知,IO操作的效率很低,那么,当在大量数据存储中,查询时我们不能一下子将所有数据加载到内...转载 2020-03-07 16:58:47 · 91 阅读 · 0 评论 -
滑动窗口
滑动窗口可以看成数组中框起来的一个部分。在一些数组类题目中,我们可以用滑动窗口来观察可能的候选结果。当滑动窗口从数组的左边滑到了右边,我们就可以从所有的候选结果中找到最优的结果。对于这道题来说,数组就是正整数序列 [1, 2, 3, …, n]。我们设滑动窗口的左边界为i,右边界为j,则滑动窗口框起来的是一个左闭右开区间 [i, j)[i,j)。注意,为了编程的方便,滑动窗口一般表示成一个左闭右...原创 2020-03-06 11:27:50 · 201 阅读 · 0 评论