优先队列

基于堆的优先队列

不羁的心 提交于 2019-12-02 23:45:30
1.概念:   优先队列:普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。在优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。优先队列具有最高级先出 (first in, largest out)的行为特征。通常采用堆数据结构来实现。(百度百科)   二叉堆:二叉堆时一组能够用堆有序的完全二叉树排序的元素,并在数组中按照层级储存。 2.堆算法:   (1)由下至上的堆有序化(上浮)     当出现某个结点比它的父节点更大,则需要通过上浮来调整堆,使堆重新有序。     方法为交换它与它的父节点,直到它小于它的父节点为止。a[k]的父节点为a[k/2]     代码:      private void swim(int k){ while(k>1&&pq[k]>pq[k/2]){ swap(pq[k],pq[k/2]); k=k/2; } }   (2)由上至下的堆有序化(下沉)    当出现某个节点比它的子节点小,则需要下沉调整堆。    方法:将此节点与它的子节点中较大的那个交换。a[k]的子节点为a[2k]和a[2k+1]    代码: private void sink(int k){ while(2*k<=N){ int j=2*k; if(j<N&&pq[j]<pq[j+1]) j++; if(pq[k]>=pq[j])

快速计算距离Annoy算法原理及Python使用

匿名 (未验证) 提交于 2019-12-02 22:51:30
快速计算距离Annoy算法 基本原理 高维稀疏数据 进行快速相似查找,可以采用 learning to hash 参考:Minhashing & LSH & Simhash 技术汇总 ,但 高维稠密数据 查找则采用 annoy 如何从海量文本中快速查找出相似的Top N 文本 Annoy(Approximate Nearest Neighbors Oh Yeah)快速算法,在实际应用中发现无论计算速度和准确性都非常不错。 原始2D数据分布图: 1. 建立索引过程 Annoy的目标是建立一个数据结构,使得查询一个点的最近邻点的时间复杂度是次线性。Annoy 通过建立一个二叉树来使得每个点查找时间复杂度是O(log n)。 看下面这个图,**随机选择两个点,以这两个节点为初始中心节点,执行聚类数为2的kmeans过程,最终产生收敛后两个聚类中心点。**这两个聚类中心点之间连一条线段(灰色短线),建立一条垂直于这条灰线,并且通过灰线中心点的线(黑色粗线)。这条黑色粗线把数据空间分成两部分。在多维空间的话,这条黑色粗线可以看成等距垂直超平面。 在划分的子空间内进行不停的递归迭代继续划分,知道每个子空间最多只剩下K个数据节点。 通过多次递归迭代划分的话,最终原始数据会形成类似下面这样一个二叉树结构。二叉树底层是叶子节点记录原始数据节点,其他中间节点记录的是分割超平面的信息

算法(第四版)C# 习题题解――2.4

匿名 (未验证) 提交于 2019-12-02 22:06:11
整个项目都托管在了 Github 上: https://github.com/ikesnowy/Algorithms-4th-Edition-in-Csharp 查找更为方便的版本见: https://alg4.ikesnowy.com/ 这一节内容可能会用到的库文件有 PriorityQueue,同样在 Github 上可以找到。 善用 Ctrl + F 查找题目。 2.4.1 用序列 P R I O * R * * I * T * Y * * * Q U E * * * U * E (字母表示插入元素,星号表示删除最大元素) 操作一个初始为空的优先队列。 给出每次删除最大元素返回的字符。 R R P O T Y I I U Q E U 优先队列的变化如下: 输入命令 优先队列 输出 P P R P R I P R I O P R I O * P I O R R P I O R * P I O R * I O P I I O I * I I O T I I T * I I T Y I I Y * I I Y * I I * I Q Q U Q U E Q U E * Q E U * E Q * E U U * U E E 2.4.2 分析以下说法: 要实现在常数时间找到最大元素, 为何不用一个栈或者队列, 然后记录已插入的最大元素并在找出最大元素时返回它的值。

第k短路

白昼怎懂夜的黑 提交于 2019-12-02 22:03:26
问题描述 给定一个有 \(n\) 个结点, \(m\) 条边的有向图,求从s到t的所有不同路径中的第k短路径的长度。此问题可以用于城市导航(一般会给出几条路径让人选择) \(A*\) 算法 背景 \(A*\) 算法不仅在解决路径搜索相关的应用中十分普遍,包括网络路由算法、机器人探路、人工智能、游戏设计等,而且在 \(GIS\) 的交通路线导航、路径分析领域应用更加广泛。它是人工智能领域的一种图搜索策略,采用了启发式函数对搜索过程中产生的分支进行评估,以选择最佳的分支进行搜索。它实现关键在于建立一个合适的估价函数。估价函数构造得越准确,则搜索策略越优。 如何用 \(A*\) 算法求第k短路 \(A*\) 算法定义了一个对当前状态 \(x\) 的估价函数 \(f(x)=g(x)+h(x)\) ,其中 \(g(x)\) 为从初始状态到达当前状态的实际代价, \(h(x)\) 为从当前状态到达目标状态的最佳路径的估计代价。每次取出 \(f(x)\) 优的状态 \(x\) ,扩展其所有子状态,可以用优先队列来维护这个值。 在求解 \(k\) 短路问题时,令 \(h(x)\) 为从当前结点到达终点 \(t\) 的最短路径长度。可以通过在反向图上对结点 \(t\) 跑单源最短路预处理出对每个结点的这个值。 由于设计的距离函数和估价函数,对于每个状态需要记录两个值,为当前到达的结点 \(x\)

Java PriorityQueue && PriorityBlockingQueue

*爱你&永不变心* 提交于 2019-12-02 20:26:15
Java PriorityQueue && PriorityBlockingQueue 我们知道队列是遵循先进先出(First-In-First-Out)模式的,但有些时候需要在队列中基于优先级处理对象。举个例子,比方说我们有一个每日交易时段生成股票报告的应用程序,需要处理大量数据并且花费很多处理时间。客户向这个应用程序发送请求时,实际上就进入了队列。我们需要首先处理优先客户再处理普通用户。在这种情况下,Java的PriorityQueue(优先队列)会很有帮助。 PriorityQueue类在Java1.5中引入并作为 Java Collections Framework 的一部分。 PriorityQueue是基于优先堆的一个无界队列, 这个优先队列中的元素可以默认自然排序或者通过提供的Comparator(比较器)在队列实例化的时排序。 优先队列不允许空值,而且不支持non-comparable(不可比较)的对象,比如用户自定义的类。优先队列要求使用Java Comparable和Comparator接口给对象排序,并且在排序时会按照优先级处理其中的元素。 优先队列的头是基于自然排序或者Comparator排序的最小元素。如果有多个对象拥有同样的排序,那么就可能随机地取其中任意一个。当我们获取队列时,返回队列的头对象。 优先队列的大小是不受限制的,但在创建时可以指定初始大小

杭电OJ 1053(C )

倖福魔咒の 提交于 2019-12-02 09:13:14
本题实现哈夫曼编码,使用优先队列即可。 #include <iostream> #include <string> #include <queue> #include <functional> #include <iomanip> using namespace std; int num[30]; //各字符出现的次数 int sum; //哈夫曼编码总长度 priority_queue <int, vector<int>, greater<int>> q; //升序优先队列 void encode(); //实现哈夫曼编码 int main() { string str; while (cin >> str) { if (str == "END") break; sum = 0; memset(num, 0, sizeof(num)); while (!q.empty()) //将之前计算中队列剩余元素清空(只有一个元素时会剩余) q.pop(); for (int i = 0; i < str.length(); i++) { if (str[i] == '_') num[26]++; else num[str[i] - 'A']++; } for (int i = 0; i < 30; i++) { if (num[i] > 0) q.push(num[i]); /

数据结构 | 优先队列和堆

陌路散爱 提交于 2019-12-02 06:21:34
优先队列 满足操作: 插入一个数值 取出最小的数值(获得数值,并且删除) 实现:堆(二叉搜索树) 堆 性质:二叉树, 儿子的值一定不小于父亲的值。 初始堆 插入数值举例,向初始堆中插入数值3时,首先在堆的末尾插入该数值,然后不断向上提升直到没有大小颠倒为止。 取出最小值举例,从堆中删除最小值时,首先把堆的最后一个节点的数值复制到根节点上,并且删除最后一个节点。然后不断向下交换直到没有大小颠倒为止。在向下交换的过程中,如果有2个儿子,选择数值较小的儿子进行交换。 堆操作的时间复杂度 堆的两种操作所花的时间都和树的深度成正比。 如果一共有n个元素,那么每个操作可以在 O(logn) 的时间内完成。 来源: https://blog.csdn.net/qq_34170700/article/details/102728828

优先队列的基本算法(使用二叉堆构建优先队列)

ⅰ亾dé卋堺 提交于 2019-12-02 02:22:56
一、介绍 堆,也是计算中一种很常用的数据结构,它以树的形式存在。 对于树的结构,因为有父节点和子节点的概念,所以一般通过父指针和子指针来实现。但是,也有一种特殊的树不需要使用指针而可以直接通过数组来实现,这种树就是完全二叉树(除了最后一层不用全满,其他层必须全满,而且最后一层的叶子结点都靠左对齐)。今天我们要讨论的二叉堆就是一棵完全二叉树,二叉堆也是堆的一种,只不过二叉堆拥有自己的特点,它分为最大堆和最小堆。 二叉堆特点: 最大堆:所有的父节点值都不小于其孩子节点值。(注意“其”字,仅限于当前父节点和它的子节点的比较) 最小堆:所有的父节点值都不大于其孩子节点值。(注意“其”字,仅限于当前父节点和它的子节点的比较) 算法: parent = floor(i/2),leftChild = 2*i, rightChild = 2*i+1 [注意: 存储的角标从1开始]。 二叉堆图示: 二、使用 之前的篇幅介绍过链队列和顺序队列,它们都是普通的队列,采用先进先出的方式来对元素进行操作。可是,有的时候需求并不是仅仅如此,可能会来一个优先级更高的元素操作,这个时候把它按照普通队列的方式进行处理明显是不合适的。而且,普通队列的入队和出队的时间复杂度也不是最优的。此时采用二叉堆构建优先队列,是一个折中的选择,时间复杂度是最优的,如图所示: 三、代码 定义 #include <iostream>

C++ STL 知识小结

杀马特。学长 韩版系。学妹 提交于 2019-12-01 23:26:04
qwq...接近联赛,就在这里对STL做一点知识小结吧,因为STL曾经失分很多。 简介 (来自Baidu) STL是Standard Template Library的简称,中文名标准模板库,惠普实验室开发的一系列软件的统称。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室工作时所开发出来的。从根本上说,STL是一些“容器”的集合,这些“容器”有list,vector,set,map等,STL也是算法和其他一些组件的集合。这里的“容器”和算法的集合指的是世界上很多聪明人很多年的杰作。STL的目的是标准化组件,这样就不用重新开发,可以使用现成的组件。STL现在是C++的一部分,因此不用安装额外的库文件。 声明 每一个大标题下的某个容器,其名称和头文件相同。如queue/priority_queue的头文件是queue。 vector vector可以理解一个不定长数组,内部基于倍增思想实现,在我们设置vector的时候,它申请的内存空间往往是我们设置的2倍,所以使用的时候要谨慎,爆空间就危险了。vector支持随机访问,就像数组一样,但不支持像链表一样O(1)插入,一般是在末尾增删。 操作函数: size:返回此数组的实际长度。 empty:判断是否为空,为空则返回true。 (所有的STL容器都支持这两个方法,含义也相同)

B. Minimize the error(优先队列?)

余生颓废 提交于 2019-12-01 20:40:47
B. Minimize the error time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output You are given two arrays A and B , each of size n . The error, E , between these two arrays is defined . You have to perform exactly k 1 operations on array A and exactly k 2 operations on array B . In one operation, you have to choose one element of the array and increase or decrease it by 1 . Output the minimum possible value of error after k 1 operations on array A and k 2 operations on array B have been performed. Input The first line contains three space