数据结构与算法
文章平均质量分 59
ali48
望诸君不吝赐教!!!
展开
-
Floyd 循环检测算法(快慢指针法/龟兔指针法)
Floyd Cycle Detection Algorithm Floyd Cycle Detection Algorithm,即 Floyd 循环检测算法,又称快慢指针法、龟兔指针法。该算法用于判断链表是否存在环,以及判断环的起点与长度的算法。算法原理 该算法基于两个指针,从头开始遍历,一个指针跑得快,另一个指针跑得慢,其中快指针的速度是慢指针的2倍。只要存在环,无论快慢指针从哪里开始,那么快慢指针最终一定会相遇,因为快指针没走一次,都会向慢指针靠近一个节点。算法应用判断是否有环 如果原创 2022-01-28 01:46:46 · 1333 阅读 · 0 评论 -
浅谈单调队列
单调队列单调队列,即队列中元素之间的关系具有单调性,单调递减或单调递增,队首只出列,队尾可入列、出列。实现方法1.使用双端队列 Deque 实现2.使用一个数组和 front、rear 两个指针来实现front 指针指向队首元素,rear 指针指向队尾元素,即可实现队首出队与队尾入队、出队操作,如下图所示:由于需要保持单调性,当一个新元素入队时,就需要与队尾元素比较,如果队尾元素大于将入队元素(假设单调递增),则将它从队尾出队,继续重复操作,直到队尾元素小于它,然后将它入队,如下图所示:原创 2021-11-27 10:38:58 · 125 阅读 · 0 评论 -
数据处理 —— 差分
差分 考虑一个问题,给出 n 个数据,每次给出一个请求(x, y, k),每次将 x 到 y 位置的数据加上 k,要求在 O(n) 的时间内解决。暴力解法 —— O(n2),明显不行。线段树或树状数组 —— O(qlogn),q 为请求次数。差分 —— O(n),不辱使命。实现方法开一个于原数组相同大小的数组用于差分。进行差分操作,比如需要 2~5 位置的元素都加 1,那么我们就将位置 2 标记为 +1,位置 6 标记为 -1,这样操作所有请求(不懂也先照做)。计算前缀和,然后再来看原创 2021-11-24 20:00:47 · 5312 阅读 · 0 评论 -
数据处理 —— 前缀和
前缀和设 Si = A1 + A2 + ··· + Ai,其中 Si 就是叫做位置 i 的前缀和。int[] a = new int[n];int[] x = new int[n];for (int i = 0; i < n; ++i) { a[i] = nextInt(); x[i] = i>0?x[i-1] + a[i]:a[i];// 前缀和的计算}前缀和应用Ai + Ai+1 + ··· + Aj = Sj - Si-1,其直观含义是连续子序列之和等于两个前缀和之原创 2021-11-24 19:41:16 · 280 阅读 · 0 评论 -
还不会做最大子段和?
最大子段和 最大子段和一定是每个(准)程序员都接触过的问题,题目很简洁:给出一个长度为 n 的序列 a,选出其中连续且非空的一段使得这段和最大。为什么每个(准)程序员都需要掌握呢?首先这问题解法很多,时间复杂度从 O(n3) -> O(n2) -> O(nlog2n) -> O(n)。通过解决这个问题可以体会到不同算法的效率差异,其次几种解法中包含分治、前缀和、贪心……等很多算法思想,深入理解最大子段和问题可以举一反三,映射到许多其他问题。1.暴力 —— O(n3)最容易想到的方法原创 2021-11-24 19:20:43 · 318 阅读 · 0 评论 -
二分查找 vs. N分查找
二分查找 二分查找(Binary Search)又称折半查找,是一种高效率的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。原理 满足条件表中元素有序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成两个子表,根据中间关键字和查找关键字的关系在子表中查找,重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。二分查找分析 优点: 比较次数少,查找速度快,平均性能好。原创 2021-05-20 21:47:22 · 913 阅读 · 0 评论 -
你管这叫 PageRank 算法
算法简介 PageRank(网页排名),用于衡量网页的重要程度的Google专有算法。最早的搜索引擎采用的是分类目录的方法,即通过人工进行网页分类并整理出高质量的网站。后来网页越来越多,人工分类已经不现实了。搜索引擎进入了文本检索的时代,即计算用户查询关键词与网页内容的相关程度来返回搜索结果。这种方法突破了数量的限制,但是搜索结果不是很好。因为总有某些网页来回地倒腾某些关键词使自己的搜索排名靠前。 谷歌的两位创始人,当时还是美国斯坦福大学研究生的佩(Larry Page)和布林(Sergey Bri原创 2021-05-19 23:02:10 · 685 阅读 · 0 评论 -
小艾和她女朋友(俄罗斯农民乘法)
问题描述 小艾是产自中国的一个移位寄存器,他最近很苦恼,他和他的同事吵架了,他们无法合作导致无法完成乘法操作,因为他自己只会通过移位完成乘2的乘法和除以2的除法,所以他无法完成复杂乘法。小艾的女朋友又比较笨,死活学不会乘法,小艾的女朋友不愿看他继续消沉下去,决定和小艾来一次说走就走的旅行,他们选择去俄罗斯看冰雪大世界,旅途中,小艾依然心不在焉,一位俄罗斯农民伯伯看出小艾有心事,便自动和小艾聊起了天,得知小艾是因为这点小事苦恼,农民伯伯说他有办法帮助小艾重回巅峰,小艾顿时来了精神,赶忙向农民伯伯请教。农民原创 2021-05-16 00:10:13 · 748 阅读 · 0 评论 -
在 O(1) 时间复杂度获取栈中最大值和最小值
问题描述 如何在O(1)时间复杂度获取栈中的最大值和最小值?问题分析 普通栈规定的push(入栈)、pop(出栈)、peek(查看栈顶)等操作都只能在栈顶上操作,如果栈中元素是有序的,那么我们就可以记录栈顶和栈底元素完成问题要求,但这是不可能的。普通栈不能解决问题,显然我们需要重新定义一种新的栈结构。能否在栈中定义两个变量min和max记录最小值和最大值呢,答案是否定的,因为并不是只有进栈操作,经过一系列出栈操作后,有可能最开始的最大值和最小值已经出栈。为了解决这个问题,我们就需要两个辅助栈记录栈原创 2021-05-15 16:18:23 · 1596 阅读 · 0 评论