关于优先队列和hash的简介
一.优先队列的引入
JDK API中的定义如下:一个基于优先级堆的无界优先级队列。优先级队列的元素按照其自然顺序进 行排序,或者根据构造队列时提供的 Comparator 进行排序,具体取决于所使用的构造方法。优先 级队列不允许使用 null 元素。依靠自然顺序的优先级队列还不允许插入不可比较的对象;
1》add(),的方法:将指定的元素插入到队列中
这个方法的好处在于,它会自动增加队列的长度。
2》clear(),的方法:从此队列中移除所有元素
3》offer() :将指定的元素插入此优先级队列
4》peek()和poll()的区别;前者获取但不移除头元素,后者获取但会移除头元素。二者对于空队 列,都会返回一个null;
至于其它的方法,文档中有很清晰的介绍。
二.自己对于优先队列的看法
如果像文档那样实现各种方法,则需要写很多相关的类。其实我们可以通过一个简单的例题,来表 达其基本的操作。
例:给你很多的数,让你选出其中的10个最大的数。这里很多我们就以100进行量化、
以下是代码的具体实现:
public class MyListQueen {
int s[]=new int[10];
/**
*
* @param a 你要排序的数组
* @return 排好序的数组
*/
public void chushi(int a[]){
for(int i=0;i<a.length;i++){
for(int j=i+1;j<a.length;j++){
//进行交换
if(a[i]>a[j]){
int t=a[i];
a[i]=a[j];
a[j]=t;
}
}
}
for(int k=0;k<10;k++)
s[k]=a[k];
}
/**
*
* 添加元素进行排序的
*/
public void addNode(int x,int i,int j){
if(j-i<=1){
for(int k=0;k<i;k++)
s[k]=s[k+1];
s[i]=x;
return;
}
int middle=(i+j)/2;
if(x<s[middle])
addNode(x,i,middle);
else if(x>s[middle])
addNode(x,middle,j);
}
/**
* 打印的方法
*/
public void Systemlist(){
for(int i=0;i<s.length;i++){
System.out.print(s[i]+",");
}
}
}
一个主类来运行
import java.util.Random;
public class TestList2 {
public static void main(String args[]){
MyListQueen list=new MyListQueen();
int a[]=new int[10];
Random random=new Random();
for(int i=0;i<10;i++){
a[i]=random.nextInt(100);
}
//初始数组
list.paixu(a);
//加入新的元素
for(int j=0;j<100;j++)
list.addNode(random.nextInt(100), 0, 10);//进行优先选择
list.Systemlist(); //打印数据
}
}
我是通过一个固定数组来保存需要的数据,当然你也可以通过固定结点的树来进行优先选择。
当然该问题实际上含有几个变量的。以上是选择最大的数,你也可以选择最小的数。选择的数的数 量也是一个变量。还有从多少数中选择等等。
三.hash结构的深度认识
有人会问,hash的结构是什么样?在我的脑海中,我可以形象的用一个数组加一个链表来描述。数组存放K值,链表并行的放那些具有相同K值的对象。
在这个结构中,时常会听见一些术语。
hash函数:其作用,相当于一个算法规则。给了相应的k值,你就可以通过hash函数求出对应的V值。它是该结构的逻辑支撑。也是产生该结构的 充要条件、(或许有更加精确的解释)
阀值:每个数组对应的链表长度(这是我的理解);
冲突:对于不同的关键字可能得到同一哈希地址,即Key1不等于Key2,而f(Key1)=f(Key2),这种现象称冲突、具有相同函数值的关键字对该哈希函数来说称做同义词。
哈希函数的构造方法:
1.直接定址法
取关键字或关键字的某个线性函数值为哈希地址。即:
H(key)=Key或H(key)=a*Key+b;
其中a和b为常数(这种哈希函数叫做自身函数).
2.数字分析法
取数据元素关键字中某些取值较均匀的数字位作为哈希地址的方法。
等等构造方法,其实去网上我们都可以看到的。这里就不多说。一直想寻求hash表的应用,看了一些,感觉都是很抽象。要说就我所知道,hash表在查找上的应用较为突出。
构造一个hash表,通过hash函数,确定k值和存储地址的关系。通过这个关系,我们可以不通过比较就可以快速的查找出你需要的元素。
还有许多的方法,你可以通过百度了解。
分享到:
相关推荐
- `q` 和 `r`:分别用于记录队列的头指针和尾指针。 - `quene[]`:数组形式的队列,用于存储待处理的节点。 - `n` 和 `m`:分别表示网格的行数和列数。 - `map[][]`:二维字符数组,表示网格地图。其中 `#` 表示障碍...
5. 设计算法:如Dijkstra算法、A*搜索算法中的优先队列等。 总结,哈希技术在IT领域有着广泛的应用,理解其基本原理和经典源码实现对于提升编程能力至关重要。通过对哈希函数的选择和优化,我们可以创建更高效、更...
9.1 单端优先队列和双端优先队列 9.2 左倾树 9.3 二项式堆 9.4 Fibonacci堆 9.5 配偶堆 9.6 对称最小-最大堆 9.7 区间堆 9.8 参考文献和选读材料 第10章 高效二叉查找树 10.1 最优二叉查找树 10.2 AVL树 ...
3. **优先队列**:如果考虑优先级服务,例如VIP顾客享受快速通道,那么我们可以使用优先队列。优先队列允许根据优先级决定哪个元素最先被处理。在Python中,`heapq`库可以用来实现优先队列。 4. **链表**:链表数据...
3. **更新优先队列**:当更新某个顶点的距离时,同时调整优先队列,确保下次取出的是具有最小距离的顶点。 #### 三、代码分析 ##### 3.1 数据结构定义 ```cpp struct node { node(int vv = 0, int dd = 0) : vexn...
堆常用于优先队列和高效的排序算法,如堆排序。实验要求实现基本的堆操作,如插入、删除、查找最大/最小元素,并添加一个新操作`lessthan(int key)`,返回所有小于或等于给定关键字`key`的元素。这需要维护堆的结构...
- 优先队列的基本操作包括插入元素、删除最小元素(最大元素)和检查最小元素。 9. **哈希码构造方法**: - 可以使用数字运算、字符串拼接、异或操作等构建哈希函数,确保输入的微小变化会导致哈希码的大范围变化...
### Hash表算法详解 #### 一、Top K算法详解 **问题描述:** 在搜索引擎的日志文件中,记录了用户每次检索使用的所有检索串。...此外,对于找出Top K的问题,优先队列/堆方法也是一个高效且实用的方案。
3. **树形结构**:包括二叉树、平衡树(如AVL树和红黑树)、堆(如优先队列)。二叉树是最简单的一种,每个节点最多有两个子节点。平衡树通过保持树的高度平衡来确保查找效率。堆是一种特殊的树形结构,满足堆性质,...
第6章“优先队列(堆)”,讨论了优先队列这种支持对元素进行排序的数据结构。优先队列通常与堆这种数据结构一起讨论,因为堆是实现优先队列的常用方法之一。 第7章是“排序”。排序是数据处理中的一项基本操作,本...
堆(Heap)是一种特殊的树形数据结构,满足最大堆或最小堆性质,常用于优先队列的实现。 另外,字符串作为一种特殊的数据结构,其操作包括匹配、搜索、替换等,在文本处理和自然语言处理中扮演着重要角色。而散列表...
6. 优先队列(Priority Queue):优先队列是一种数据结构,可以快速访问具有最高优先级的元素。堆通常是实现优先队列的首选数据结构。 算法部分,教材将涉及以下高级主题: 1. 排序算法(Sorting Algorithms):...
优先队列(Priority Queue)是一种特殊的队列,其中元素按照优先级排序,高优先级元素会优先处理。复用性(Reusability)强调代码或数据结构能够在多个场合重复使用,以提高软件开发的效率和质量。 总的来说,...
堆常用于优先队列的实现,比如在游戏中的任务优先级排序、事件调度等。 3. **JavaScript(JS)**:JavaScript是一种广泛使用的客户端脚本语言,主要用于网页和网络应用开发。在这个项目中,JavaScript可能用于处理...
5. **特殊数据结构**:包括散列表(Hash表)、堆栈、队列、队列、优先队列、字典树(Trie树)等,它们在解决特定问题时有着高效的表现,如哈希表的快速查找、字典树的字符串查找等。 通过《C版数据结构》的学习和...
3. 使用哈希表或优先队列来存储和更新行计数。 4. 提供API,如`addLine()`,`updateLineCount()`,`getMostFrequentLines()`等,便于其他部分的代码与数据结构交互。 5. 在`tcov.c`中实现这些函数,并可能在`sunview...
7. **CHAP12**:可能是高级数据结构,如堆、优先队列和B树等,这些在数据库和操作系统中广泛应用。 8. **CHAP02**:可能介绍基本数据结构,如数组、字符串和结构体,它们是构建复杂数据结构的基础。 9. **CHAP07**...
堆是一种特殊的树形数据结构,满足最大堆或最小堆的性质,常用于实现优先队列。在da09.htm或da10.htm中可能会有建立堆、调整堆、堆排序等相关习题。 通过对这些习题的练习,你可以巩固对数据结构的理解,提升算法...
讨论中提到的最优方法结合了散列、映射(Map)和优先队列(Priority Queue)。首先,利用散列函数将短信映射到哈希表中,然后使用链表处理哈希冲突。在哈希表中,通过映射(Map)记录短信出现的频率。最后,用优先...