关于优先队列和hash的简介

关于优先队列和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值和存储地址的关系。通过这个关系,我们可以不通过比较就可以快速的查找出你需要的元素。
    还有许多的方法,你可以通过百度了解。   
 

你可能感兴趣的:(数据结构)