1. 程式人生 > >hash表海量查詢字串(java版)

hash表海量查詢字串(java版)

 雜湊表(散列表)是一種非常高效的查詢資料結構,在原理上也與其他的查詢不盡相同,它迴避了關鍵字之間反覆比較的繁瑣,而是接一步到位查詢結果。當然,這也帶來了記錄之間沒有任何關聯的弊端。應該說,散列表對於那些查詢效能要求高,記錄之間關係無要求的資料有非常好的適用性。注意對雜湊函式的選擇和處理衝突的方法。

        Hash表是使用 O(1)時間進行資料的插入、刪除和查詢,但是 hash 表不保證表中資料的有序性,這樣在 hash 表中查詢最大資料或者最小資料的時間是 O(N) 。

當然首先得建立hash表儲存字串。

// 測試hash表的簡單應用
public class testhash {

	private String[] name;//關鍵字
	private int sum;//當前容量
	public static void main(String[] args) {
		// TODO 自動生成的方法存根
		testhash t=new testhash();
		t.add("java");
		t.add("C#");
		t.add("C++");
		t.add("C");
		t.add("pathyn");
		t.add("VB");
		t.add("PHP");
		t.add("shell");
		t.print();
		String teststr="C++";
		if(t.contains(teststr)){
			System.out.println("YES");
		}else{
			System.out.println("NO");
		}
	}
	public testhash(){
		name=new String[10];
		sum=0;
	}
	//新增字串到hash表
	public void add(String s){
		if(sum>=this.name.length/2){
			this.refresh();
		}
		int start=hash1(s);
		int i=start;
		while(name[i]!=null){
			if(name[i].equals(s)){
				return ;
			}
			i=(i+hash2(s))%name.length;
			if(i==start){
				return ;
			}
		}
		name[i]=s;
		sum++;
		
	}
	//因為長度不夠,擴充hash表
	public void refresh(){
		testhash t=new testhash();
		t.name=new String[this.name.length*2];
		int i=0;
		for(i=0;i<name.length;i++){
			if(this.name[i]!=null){
				t.add(this.name[i]);
			}
		}
		this.name=t.name;
		this.sum=t.sum;
	}
	//正常的hash函式
	public int hash1(String s){
		return Math.abs(s.hashCode()%name.length);
	}
	//處理衝突的hash函式
	public int hash2(String s){
		int result=Math.abs(s.hashCode()%(name.length-1));
		if(result%2==0){
			return result+1;
		}
		return result;
	}
	public boolean contains(String s){
		int start=hash1(s);
		int i=start;
		while(name[i]!=null){
			if(name[i].equals(s)){
				return true;
			}
			i=(i+hash2(s)%name.length);
			if(i==start){
				return false;
			}
		}
		return false;
	}
	//列印所有的hash鍵值對
	 public void print(){                       //輸出雜湊表中所有元素
	     for(int i = 0; i < name.length; i ++){
	        System.out.println(i+":"+name[i]);
	    }
	  }
}


相關推薦

hash海量查詢字串java

 雜湊表(散列表)是一種非常高效的查詢資料結構,在原理上也與其他的查詢不盡相同,它迴避了關鍵字之間反覆比較的繁瑣,而是直接一步到位查詢結果。當然,這也帶來了記錄之間沒有任何關聯的弊端。應該說,散列表對於那些查詢效能要求高,記錄之間關係無要求的資料有非常好的適用性。注意對雜

單鏈是否有環Java

題目:判斷一個帶頭結點的單鏈表L是否有環 解題思路: 咋看之下,這題還真不好解,於是又一些投機取巧的人,在訪問單鏈表中元素的時候,用一個比較大的數N控制訪問元素的個數,他們認為如果在訪問到第N個元素之

單鏈就地逆置Java

題目:有一個線性表(a1,a2,a3,...,an),採用帶頭節點的單鏈表L儲存,設計一個演算法將其就地逆置,線性表變為(an,...a3,a2,a1)。所謂“就地”指輔助儲存空間為O(1)。

左旋轉字串java

【題目描述】組合語言中有一種移位指令叫做迴圈左移(ROL),現在有個簡單的任務,就是用字串模擬這個指令的運算結果。對於一個給定的字元序列S,請你把其迴圈左移K位後的序列輸出。例如,字元序列S=”abcXYZdef”,要求輸出迴圈左移3位後的結果,即“XYZdef

劍指Offer面試題15Java:鏈中倒數第K個結點

head 計數器 easy sta 相同 ret white style 輸出 題目: 輸入一個鏈表。輸出該鏈表中倒數第k哥結點。 為了符合大多數人的習慣,本題從1開始計數。即鏈表的尾結點是倒數第1個結點。 比如一個鏈表有6個結點。從頭結點開始它們的值依次是1。2。

資料結構基礎------1.線性之單鏈的建立與輸出方法Java

基礎知識: 線性表(linear list),是其組成元素間具有線性關係的一種線性結構。 線性表有 ①順序儲存結構(sequential storage structure) 順序儲存結構可以簡單的理解利用為 陣列 的形式來進行儲存資料。 ②鏈式儲存結構(ch

一行程式碼搞定二分查詢java

效果如圖: public static int rank(double key,double[] a,int lo,int hi){ return lo>hi?-1:key<a[lo+(hi-lo)/2]?rank(key,a,lo,lo+(hi-lo)/2-

輸出單鏈中倒數第k個結點Java

題目:輸入帶頭結點的單鏈表L,輸出該單鏈表中倒數第k個結點。單鏈表的倒數第0個結點為該單鏈表的尾指標。要求只能遍歷一次單鏈表。 解題思路: 如果不要求只能遍歷一次單鏈表,我們可以先遍歷一次單鏈表

資料結構之單鏈的增刪改查java

talk is cheap,show you zhe code; /* * 單鏈表的遍歷是從第0個節點開始 沿著next鏈,一次訪問每個節點並且每個節點只能訪問一次 * 當頭結點head為空時 此連結串列為空連結串列 * * 插入操作 * 1空

正則表示式之前後查詢Java 例項

參考部落格:http://blog.csdn.net/libingxin/article/details/7840998 ?= 正向向前查詢:出現在指定項之後的字元序列不會被正則表示式引擎返回 ?<= 正向向後查詢:出現在指定項之前的字元

劍指Offer-題48Java:最長不含重複字元的子字串

參考自:《劍指Offer——名企面試官精講典型程式設計題》 題目:最長不含重複字元的子字串 請從字串中找出一個最長的不包含重複字元的子字串,計算該最長子字串的長度。假設字串中只包含從’a’到’z’的

排序算法java

emp ive public while href ava 指針 循環 lec 1. 冒泡算法2. 快速排序3. 歸並排序4. 選擇排序5. 堆排序 排序算法 重要性不言而喻,很多算法問題往往選擇一個好的排序算法往往問題可以迎刃而解 1、冒泡算法

高速排序Java

content 輸入 println pop package ati 遞歸 子列 大於 package com.love.test; import java.util.Scanner; /** * @author huowolf *高速排序實現 *快排是十

劍指Offer面試題43Java:n個骰子的點數

pac pos max mod ins pri class pro bili 題目:把n個骰子仍在地上。全部骰子朝上一面的點數之和為s,輸入n,打印出s的全部可能的值出現的概率。 解法一:基於遞歸求骰子的點數,時間效率不夠高 如今我們考慮怎樣統計每個點數出現的次數。要向

傻瓜方法求集合的全部子集問題java

post 分解 ipp targe 找到 creat dojo class length 給定隨意長度的一個集合。用一個數組表示,如{"a", "b","c"},求它的全部子集。結果是{ {a},

小米2017秋招真題——電話號碼分身問題Java

imp spa ray 描述 mov lose port next can 原題描述如下: 通過對各個數字對應的英文單詞的分析,可以發現一些規律: 字母Z為0獨占,字母W為2獨占,字母U為4獨占,字母X為6獨占,字母G為8獨占; 在過濾一遍0、2、4、6、8後,字母O為1

jieba分詞/jieba-analysisjava

日本 word amp b- exception 鏈接 arp not unit 簡介 支持分詞模式Search模式,用於對用戶查詢詞分詞Index模式,用於對索引文檔分詞特性支持多種分詞模式全角統一轉成半角用戶詞典功能conf 目錄有整理的搜狗細胞詞庫因為性能原因,最新的

基於Lucene框架的“虎撲籃球”網站搜索引擎java

writer 用戶 源碼 static 數組 head 完整 需求 ash  1 引言 本次作業完成了基於Lucene的“虎撲籃球”網站搜索引擎,對其主要三個板塊---“最新新聞”(主要NBA新聞),“虎撲步行街”(類似貼吧性質),“虎撲濕乎乎”(籃球發帖區)進行頁

名師帶你學微信開發Java

IT 視頻 ava 14. ade BE src pict idt ======================================================= 長期更新IT編程視頻教程,資料收集整理不易,需要一點費用 有意者加QQ:277

七大經典排序Java

AR The 插入 構建 選擇 n個元素 升序 基準 互換 . 冒泡排序: 通過相鄰的兩個數的比較, 根據需要決定是否將兩個數互換位置, 然後將比較往前(或往後)推進. 最簡單的排序算法,直接上代碼。    for(i=0;i<lengt