优先队列

栈,队列,优先队列

ⅰ亾dé卋堺 提交于 2020-01-01 14:35:28
[博客转自] http://www.cnblogs.com/yushuo1990/p/5995051.html 再次面对像栈和队列这样的相当基础的数据结构的学习,应该从多个方面,多维度去学习。 首先,这两个数据结构都是比较常用的,在标准库中都有对应的结构能够直接使用,所以第一个阶段应该是先学习直接来使用,下一个阶段再去探究具体的实现,以及对基本结构的改造! C++标准库中的基本使用方法: 栈: #include<stack> 定义栈,以如下形式实现: stack s; 其中Type为数据类型(如 int,float,char等) 常用操作有: s.push(item);    //将item压入栈顶 s.pop();        //删除栈顶的元素,但不会返回 s.top();       //返回栈顶的元素,但不会删除,,,,,,,,,在出栈时需要进行两步,即先top()获得栈顶元素,再pop()删除栈顶元素 s.size();      //返回栈中元素的个数 s.empty();     //检查栈是否为空,如果为空返回true,否则返回false 最基本的用法就是: stack<int> st;---------------------------------->栈 int first=1; st.push(first);//入栈1 int second=2; st

python优先队列,队列和栈

六眼飞鱼酱① 提交于 2020-01-01 14:35:03
打印列表的疑问 class Node: def __str__(self): return "haha" print([Node(),Node()]) print(Node()) 输出为 [<__main__.Node object at 0x000000000311A208>, <__main__.Node object at 0x000000000311A358>] haha 打印列表调用的不是每个元素str吗?看来不是,那调用的是什么. 一个简单的实例 在自定义结点的时候,需要实现__lt__()函数,这样优先队列才能够知道如何对结点进行排序. import queue import random q = queue.PriorityQueue() class Node: def __init__(self, x): self.x = x def __lt__(self, other): return other.x > self.x def __str__(self): return "{}".format(self.x) a = [Node(int(random.uniform(0, 10))) for i in range(10)] for i in a: print(i, end=' ') q.put(i) print("=============") while q

leetcode-最后一块石头的重量

我只是一个虾纸丫 提交于 2019-12-27 04:22:23
class Solution { public int lastStoneWeight(int[] stones) { PriorityQueue<Integer> queue = new PriorityQueue<>((o1,o2)->o2-o1); for(int i=0;i<stones.length;i+=1){ queue.add(stones[i]); } while(queue.size()>0){ if(queue.size()==1){ return queue.poll(); } else{ int num1 = queue.poll(); int num2 = queue.poll(); queue.add(Math.abs(num1-num2)); } } return 0; } } 核心就是使用一个使用优先队列构造一个最大堆 很多时候看到最大的前几个等等,我们很容易想到使用贪心算法,而优先队列常用来解决贪心算法问题。 要记住了出队列用poll(),出栈用pop() 来源: CSDN 作者: dogndaxiaodong 链接: https://blog.csdn.net/weixin_41327340/article/details/103722990

[POJ3481 Double Queue]优先队列

倾然丶 夕夏残阳落幕 提交于 2019-12-23 20:58:31
[POJ3481 Double Queue]优先队列 用到了一些有趣的方法 Double Queue Description The new founded Balkan Investment Group Bank (BIG-Bank) opened a new office in Bucharest, equipped with a modern computing environment provided by IBM Romania, and using modern information technologies. As usual, each client of the bank is identified by a positive integer K K K and, upon arriving to the bank for some services, he or she receives a positive integer priority P P P . One of the inventions of the young managers of the bank shocked the software engineer of the serving system. They proposed to break the tradition by

3305: Hero In Maze II (优先队列+bfs)

99封情书 提交于 2019-12-21 21:17:41
Description 500年前,Jesse是我国最卓越的剑客。他英俊潇洒,而且机智过人^_^。 突然有一天,Jesse心爱的公主被魔王困在了一个巨大的迷宫中。Jesse听说这个消息已经是两天以后了,他急忙赶到迷宫,开始到处寻找公主的下落。令人头痛的是,Jesse是个没什么方向感的人,因此,他在行走过程中,不能转太多弯了,否则他会晕倒的。 我们假定Jesse和公主所在的位置都是空地,初始时,Jesse所面向的方向未定,他可以选择4个方向的任何一个出发,而不算成一次转弯。希望你帮他判断一下他是否有机会找到心爱的公主。 Input 题目包括多组测试数据. 第1行为一个整数T(1 ≤ T≤ 100),表示测试数据的个数,接下来为T组测试数据. 每组测试数据以两个整数N,M,K(1<=N, M≤100, 0<K<=10)开头,分别代表迷宫的高,长和Jesse 最多能转的弯数,(紧接着有N行,M列字符,由".","*","P","S"组成。其中 "." 代表能够行走的空地。 "*" 代表墙壁,Jesse不能从此通过。 "P" 是公主所在的位置。 "S" 是Jesse的起始位置。 每个时间段里Jesse只能选择“上、下、左、右”任意一方向走一步。 Output 如果Jesse能在晕之前找到公主,输出“YES”,否则输出“NO”。 Sample Input 2 5 5 1 P..** *.**

利用c++实现哈希慢算法

丶灬走出姿态 提交于 2019-12-20 04:33:19
我想每个计算机专业的学生或多或少都接触过哈夫曼编码,数据结构中的老问题了。大体就是给出一些字符,和这些字符的出现频率,让你为这些字符设计一个二进制编码,要求频率最高的字符的编码最短。解决的方法是构造一棵哈夫曼树(二叉树),其基本思路是,每次从这些字符中挑出两个频率最低的,然后构造一个新的结点,使新结点的左右孩子指针分别指向那两个节点。我想这个大家都很清楚了,我就不多说了。主要讲下这次我用C++实现时遇到的问题。首先,我定义了一个哈夫曼树结点: class hNode {  public:   friend bool operator > (hNode n1,hNode n2); //定义了大于符号,供优先队列排列使用   hNode(string d="",int i=0,hNode* l = NULL,hNode* r =NULL):left(l),right(r),data(d),value(i){}   hNode* left;   hNode* right;   string data; //储存的字符串   int value; //字符串出现的次数 }; bool operator >(hNode n1,hNode n2) {  return n1.value > n2.value; } 仅仅只是存放数据的对象,所以只有一个构造函数,并且所有的data

优先队列和堆

那年仲夏 提交于 2019-12-19 05:13:29
优先队列和堆 普通队列:先进先出,就像是我们在银行办业务或者是在超市买东西,但是考虑在医院,有病人有突发情况,这个时候容不得他去排队挂号了,这时他的优先级是比较高的,所以他需要得到优先的处理,像这种队列中的元素具有优先级的队列,我们把它称之为优先队列。在游戏中我们也会设置优先攻击血量最低的怪或者距离最近的怪,这时候血量和距离就成为了判断优先级的标准;在操作系统的任务调度,我们为程序分配 CPU ,内存等等资源,并不是先到先得的,也是根据程序的优先级来进行分配的。 堆的结构 这里的堆指的是二叉堆,它满足以下的性质 二叉堆是一棵完全二叉树 把元素顺序排列成树的形状 堆中某个节点的值总是不大于其父亲节点的值 ( 最大堆,相应也可以定义最小堆 ) 如果我们使用数组去实现堆 上面的序号表示的是在数组中的下标,我们发现如果父节点的下标为i,那么左孩子的下标就为 2i + 1 ,右孩子的下标为 2i + 2 ,所以可以很快的根据父节点的下标得到左右孩子的下标,如果知道左右孩子的下标 i ,那么 (i - 1)/2 就可以得到父节点的下标(整数除法,小数部分会被舍去)。这个结论可以使用数学归纳法进行证明,但不是这里的重点,所以不多做阐述。 public class MaxHeap < E extends Comparable < E > > { private Array < E > data ;

java实现数据结构08.02(堆详解代码之基于最大堆自定义优先队列)

一笑奈何 提交于 2019-12-19 01:40:14
阅读本文章前请先阅读 java实现数据结构08.01(堆详解代码之自定义最大堆) 基于最大堆自定义优先队列 /** * @description: 优先队列,基于最大堆实现自定义优先队列 * @author: liangrui * @create: 2019-12-18 12:15 **/ public class PriorityQueue < E extends Comparable < E > > implements Queue < E > { private MaxHeap < E > maxHeap ; public PriorityQueue ( ) { maxHeap = new MaxHeap < > ( ) ; } @Override public void enqueue ( E e ) { maxHeap . add ( e ) ; } @Override public E dequeue ( ) { return maxHeap . extractMax ( ) ; } @Override public E getFront ( ) { return maxHeap . findMax ( ) ; } @Override public int getSize ( ) { return maxHeap . getSize ( ) ; } @Override

堆和优先队列

有些话、适合烂在心里 提交于 2019-12-18 19:49:05
堆:一个特殊的树 普通队列:先进先出、后进后出 优先队列:出队顺序和入队顺序无关;和优先级有关, 动态 选择优先级高低执行 实现:普通线性结构、顺序线性结构、堆O(logn) 堆的基础结构 二叉堆:(最大堆)完全二叉树,所有节点的值都大于等于其左右子树节点的值 Heapify:将任意数组整理成堆的形状 Replace:取出最大元素,放入一个新元素 来源: CSDN 作者: RecZ.z 链接: https://blog.csdn.net/weixin_43975899/article/details/103357075

C++标准模板库(STL)之Priority_Queue

让人想犯罪 __ 提交于 2019-12-17 09:48:36
1、Priority_Queue的常用用法 priority_queue:优先队列,底层是使用堆来实现的。优先队列中,队首元素一定是当前队列中优先级最高的哪一个。 a (优先级3),b(优先级4),c(优先级1),出队顺序是:b(4)-》a(3)-》c(1) 1.1、priority_queue的定义 使用优先队列,要加头文件 #include<queue>和using namespace std; priority_queue<typename> pq; 1.2、priority_queue容器元素访问 优先队列和队列queu不一样,没有front()和back()函数,只能通过top()函数访问队首元素(堆顶元素),优先级最高的元素。 #include<stdio.h> #include<queue> using namespace std; int main() { priority_queue<int> q; q.push(3); q.push(4); q.push(1); printf("%d\n",q.top());//输出结果为4 return 0; } View Code 1.3、priority_queue的常用函数 1.3.1、push() push(x):将x入队,时间复杂度为O(logN),N为优先队列中元素个数。 1.3.2、top() top()