
algorithm
文章平均质量分 51
算法相关
想做一只开心的菜鸡
本科东南大学计算机,研究生南京大学计算机
展开
-
归并排序递归与迭代实现c++
递归实现就是树的后序遍历void mergeSort_recursive(vector<int> &arr, int start, int end){ // 闭区间[start, end] if (start >= end) { return; } int mid = start + ((end - start) >> 1); // 注意(end+start)/2 当end=start+1时,mid=s原创 2021-08-26 16:47:43 · 285 阅读 · 0 评论 -
快速排序的递归和迭代两种实现,简单易懂
快速排序法的递归和迭代两种实现。迭代实现基本复用了递归实现的代码,在递归基础上小小的改动即可。递归版#include <bits/stdc++.h>using namespace std;/*快速排序递归法与迭代法实现*/void quick_sort_recursive(vector<int> &arr, int start, int end){ // 这里采用闭区间,下文迭代法也统一使用闭区间 if (start >= end)原创 2021-08-26 14:17:51 · 1292 阅读 · 0 评论 -
如何找到两个有序数组合并后的第k个元素
//在两个有序数组中找到第k个元素(例如找第一个元素,k=1,即nums[0]) //思路是比较两个数组的k/2位置的元素,每次淘汰k/2个元素 //i: nums1的起始位置 j: nums2的起始位置(i,j都是从0开始) int findKth(vector<int>& nums1, int i, vector<int>& nums2, int j, int k) { //若nums1为空(或是说其中数字...转载 2021-08-24 23:35:33 · 491 阅读 · 0 评论 -
295. 数据流的中位数
295. 数据流的中位数中位数是有序列表中间的数。如果列表长度是偶数,中位数则是中间两个数的平均值。例如,[2,3,4] 的中位数是 3[2,3] 的中位数是 (2 + 3) / 2 = 2.5设计一个支持以下两种操作的数据结构:void addNum(int num) - 从数据流中添加一个整数到数据结构中。double findMedian() - 返回目前所有元素的中位数。这题难就难在,如何在较低的时间复杂度里面实现findMedian。如果把所有数据存入数组,那么每次插入.原创 2021-08-21 23:08:35 · 183 阅读 · 0 评论 -
895. 最大频率栈
问题描述最大频率栈 实现 FreqStack,模拟类似栈的数据结构的操作的一个类。FreqStack 有两个函数:push(int x),将整数 x 推入栈中。 pop(),它移除并返回栈中出现最频繁的元素。如果最频繁的元素不只一个,则移除并返回最接近栈顶的元素。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/maximum-frequency-stack解题思路这题依然主要是按照频率和按照时间排序,和之前写的LFU 算法c++的原创 2021-08-21 15:36:39 · 602 阅读 · 0 评论 -
【动态规划】鸡蛋掉落
887. 鸡蛋掉落给你 k 枚相同的鸡蛋,并可以使用一栋从第 1 层到第 n 层共有 n 层楼的建筑。已知存在楼层 f ,满足 0 <= f <= n ,任何从 高于 f 的楼层落下的鸡蛋都会碎,从 f 楼层或比它低的楼层落下的鸡蛋都不会破。每次操作,你可以取一枚没有碎的鸡蛋并把它从任一楼层 x 扔下(满足 1 <= x <= n)。如果鸡蛋碎了,你就不能再次使用它。如果某枚鸡蛋扔下后没有摔碎,则可以在之后的操作中 重复使用 这枚鸡蛋。请你计算并返回要确定 f 确切的值 的.原创 2021-08-16 11:47:31 · 589 阅读 · 0 评论 -
最长公共子序列与最长公共子串区别
最长公共子序列与最长公共子串区别假设s1=“abaaca”, s2=“acaaba”。最长公共子序列是s1和s2的不连续的最大公共子集。例如,s1和s2的最长公共子序列是[‘a’,’a’,’a’,’a’]最长公共子串是s1和s2中连续的最长公共子串。例如,s1和s2的最长公共子串是“aca”和“aba”最长公共子序列c++实现两个实现差不多,这里均使用动态规划实现。实现一是最普通的动态规划,实现二则进行了状态压缩。实现一:无状态压缩int lcs_normal(string s1, str原创 2021-08-15 22:49:52 · 543 阅读 · 0 评论 -
贝尔曼福特和迪杰斯特拉算法区别
贝尔曼福特和迪杰斯特拉算法区别https://zh.wikipedia.org/wiki/%E8%B4%9D%E5%B0%94%E6%9B%BC-%E7%A6%8F%E7%89%B9%E7%AE%97%E6%B3%95贝尔曼福特时间复杂度:O(|V| |E|)算法伪代码procedure BellmanFord(list vertices, list edges, vertex source) // 讀入邊和節點的列表並對distance和predecessor寫入最短路徑 // 初始原创 2021-08-15 22:11:02 · 1364 阅读 · 0 评论 -
两个字符串的最小ASCII删除和,错误解法与正确解法
712. 两个字符串的最小ASCII删除和两种解法:1)首先求出lcs(最长公共子序列),然后将两个字符串的ASCII和减去两倍lcs的ASCII和。2)直接使用动态规划解法一(错误解法)总的思路分为三步:使用动态规划求出最长公共子序列的长度使用dp数组构造最长公共子序列lcs分别求出三个字符串的ascii和,然后求解最终答案对于求出最长公共子序列的长度,这个问题是经典的动态规划问题。假设有两个字符串s1,s2.dp[i][j] 表示s1前i个字符与s2前j个字符的最长公共子序列的长度。原创 2021-06-06 15:13:02 · 239 阅读 · 0 评论 -
无损压缩算法——初探
常见无损压缩算法Huffman coding这种编码方式就是需要知道每个字符(symbol)出现的频率(需要扫描所有数据一次),然后构建哈夫曼二叉树。构建过程就是每次挑选出现频率最低的两个节点作为树的左右子节点,并且将它们合并成新的节点,新节点频率是它两之和。构建好huffman树后,就可以进行huffman编码,从根节点开始,左边支路编码为0,右边支路编码为1。然后再扫描一次数据,得到最优编码。缺点是耗时长,需要扫描两遍数据。因此有相关动态的huffman编码工作来提升它的性能,可能压缩率会有所下降。原创 2021-05-15 23:34:23 · 573 阅读 · 0 评论 -
小根堆算法实现
小根堆算法实现总体思路数据结构:一个数组,下标为0的不用。假设root为当前节点的下标,则其父节点为root/2左子树为root*2右子树为root*2+1核心操作:小根堆内部的两个核心API是上浮swim() 和下沉sink()。上浮就是当前元素比父节点小,需要替代父节点,直到条件不成立。下沉就是当前节点比子节点大,需要替代最小的那个子节点,直到条件不成立。对外接口:对外提供的三个API是pop、push、和front。对于front操作,返回下标为1的元素,即根节点原创 2021-04-26 18:47:03 · 822 阅读 · 0 评论 -
动态扩容数组——零拷贝实现
c++ vector 动态数组扩容时,会申请两倍空间,并且将旧空间元素拷贝到新空间中,释放旧空间,要你实现一个动态扩容的数组,不用进行元素拷贝,怎么做呢?腾讯TEG公共平台架构部二面就问到这题,当时没回答好,事后又想了下,其实不复杂。思路:动态数组的实现可以使用hash表+数组实现,hash表存的是<i, Node*>。每个Node的大小相同,这里假设为16个元素。那么对于下标index,i = index>>4,i表示node_i,从0开始计算。Node内部可以通过数组原创 2021-04-15 19:10:59 · 754 阅读 · 0 评论 -
LFU 算法c++的两种实现
描述:实现 LFUCache 类:LFUCache(int capacity) - 用数据结构的容量 capacity 初始化对象int get(int key) - 如果键存在于缓存中,则获取键的值,否则返回 -1。void put(int key, int value) - 如果键已存在,则变更其值;如果键不存在,请插入键值对。当缓存达到其容量时,则应该在插入新项之前,使最不经常使用的项无效。在此问题中,当存在平局(即两个或更多个键具有相同使用频率)时,应该去除 最久未使用 的键。来源:力原创 2021-04-12 20:28:05 · 987 阅读 · 0 评论 -
水塘抽样算法
LeetCode 相关算法题:382. 链表随机节点 398. 随机数索引这个涉及到概率论里面的加法公式和乘法公式,不懂的可以先了解下再回来看。水塘抽样算法用于对流式数据或者数据长度很长的数据中进行随机均匀抽样。一般是抽取k个样本,在数据流当前长度为N时,保证这k个样本被抽到的概率都是kN\frac{k}{N}Nk。要求空间复杂度为O(k),时间复杂度则为仅扫描数据一遍,即O(N)。直接考虑k个样本相对困难,先可以考虑K=1的情况。我们是从第一个元素开始遍历,假设当前遍历到第i个元素,并且在前i原创 2021-03-20 00:24:42 · 890 阅读 · 0 评论 -
Contention-aware lock scheduling论文
论文:Tian, B., et al. (2018). “Contention-aware lock scheduling for transactional databases.” Proceedings of the VLDB Endowment 11(5): 648-662.该方法已被MySQL采用,并在8.0.3+被设为默认方法,应该是很成功的一个设计了。背景互斥锁与共享锁:锁是实现并发访问控制的常用手段,锁系统里面有两种锁:共享锁(S)和互斥锁(X)。在事务读一个对象前,需要先获得共享锁,同原创 2020-11-16 12:39:41 · 361 阅读 · 0 评论 -
基于深度强化学习的连接查询优化
Krishnan, S., et al. (2018). "Learning to optimize join queries with deep reinforcement learning."如何优化 SQL 连接是数据库社区数十年来一直在研究的一个大问题。伯克利 RiseLab 公布的一项研究表明,深度强化学习可以被成功地应用在优化 SQL 连接上。这篇论文表明了如何通过深度强化学习技术来攻克这个已经存在了数十年的挑战。作者将连接排序问题表示为马尔可夫决策过程(MDP),然后构建了一个使用深度原创 2020-11-13 09:58:56 · 1376 阅读 · 8 评论 -
最大最小蚁群算法的理解
蚁群算法维基百科蚁群算法(Ant Colony Optimization, ACO),又称蚂蚁算法,是一种用来在图中寻找优化路径的几率型算法。它由Macro Dorigo 与1992年的博士论文中提出,其灵感来源于蚂蚁在寻找食物过程中发现路径的行为。蚁群算法是这一种模拟进化算法,初步的研究表明该算法具有许多优良的性质。自然界中,蚂蚁的食物总是随机散布于蚁巢周围。仔细观察就会发现,经过一段时间后,蚂蚁总能找到一条从蚁巢到食物源的最短路径。主要原理:蚂蚁在一开始时,会以相同的概率选择路线,在运动过程原创 2020-09-11 15:27:01 · 5548 阅读 · 0 评论 -
给定一个入栈序列,求所有可能的出栈序列
源链接 网上有很多解法,但个人感觉不够清晰。下面本人献丑来写下自己的解法。力求简明易懂。首先这是个卡特兰数,学过组合数学的同学都知道。没学过的可以看下下面这个例子。有2n个人排成一队进入剧场。入场费5元。其中只有n个人有一张5元钞票,另外n人只有10元钞票,剧院无其它钞票可找零,问有多少中方法使得只要有10元的人买票,售票处就有5元的钞票找零?(将持5元者到达视作将5元入栈,持10元者到达视...原创 2018-09-01 11:30:49 · 5412 阅读 · 0 评论 -
二叉树遍历(清华机试题)
题目描述编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。 例如如下的先序遍历字符串: ABC##DE#G##F### 其中“#”表示的是空格,空格字符代表空树。建立起此二叉树以后,再对二叉树进行中序遍历,输出遍历结果。 输入描述: 输入包括1行字符串,长度不超过100。 输出描述: 可能有多组测试数据,对于每组数据, 输出将输入字符串建立二...原创 2018-09-09 11:33:46 · 996 阅读 · 0 评论 -
整数拆分(清华机试题)
链接:https://www.nowcoder.com/questionTerminal/376537f4609a49d296901db5139639ec 来源:牛客网搬运一下思路: 记f(n)为n的划分数,我们有递推公式:f(2m + 1) = f(2m),f(2m) = f(2m - 1) + f(m), 初始条件:f(1) = 1。证明:证明的要点是考虑划分中是否...转载 2018-09-09 10:09:02 · 717 阅读 · 0 评论 -
代理服务器(清华考研机试题)
题目描述使用代理服务器能够在一定程度上隐藏客户端信息,从而保护用户在互联网上的隐私。我们知道n个代理服务器的IP地址,现在要用它们去访问m个服务器。这 m 个服务器的 IP 地址和访问顺序也已经给出。系统在同一时刻只能使用一个代理服务器,并要求不能用代理服务器去访问和它 IP地址相同的服务器(不然客户端信息很有可能就会被泄露)。在这样的条件下,找到一种使用代理服务器的方案,使得代理服务器切换的...原创 2018-09-08 11:17:01 · 1186 阅读 · 0 评论