筆記 演算法複習筆記 陣列 集合 雜湊表(下)

2021-07-28 08:33:08 字數 2353 閱讀 5203

雜湊表是一種空間換時間的資料結構,在演算法中提公升效率的一種常用的方法。但是,正如其特點,有時候所消耗的空間,真讓人頭疼,用的時候在二者之間權衡。

雜湊表,又叫雜湊表(hashtable),是能夠通過給定的關鍵字的值直接訪問到具體對應值的資料結構。也就是說,把關鍵字映到乙個表中的位置來直接訪問記錄,以加快訪問速度。

通常,我們通過key來找value,也就是說,通過key訪問乙個對映表來得到value的位址。而這個對映表,也叫作雜湊函式或者雜湊函式,存放記錄的陣列叫做雜湊表。

如果可以通過不同的key訪問到同乙個value,那麼就發生了碰撞,我們需要的是通過乙個key可以訪問到唯一的value。

常用的處理衝突的方法有:

開放位址法(開放定址法)

就是當這個key通過雜湊函式找到存放value位址的位置,當這個位置已經存放資料,就存在其緊跟著後面沒有占用的位置,如果超過了最大長度,對最大長度取餘,這裡移動的位址是產生衝突的偏移量。

再雜湊法

產生衝突後,用關鍵字其他部分繼續計算位址,直到不產生衝突,當這種方法增加了時間。

鏈位址法

當產生衝突,把處於同一位址的資料做成乙個鍊錶,這種方法最常見。

建立公共溢位區

建立乙個公共溢位區,把產生衝突的新位址放在這個公共溢位區里。

訪問速度快

由於雜湊表有雜湊函式,把key對映到乙個位址上,訪問key對映的value時候,不需要查詢,直接跳到那個位址,因此,雜湊表的增刪改查等任何操作,速度都比較快。

需要額外的空間

當發生衝突,需要額外的空間去儲存,空間換時間,有捨才有得。

無序為了快速找到訪問的元素,根據雜湊函式直接找到儲存位址,訪問速度就快起來,但是有序訪問沒有辦法實現。

可能產生碰撞

沒有完美的雜湊函式,無論如何總會產生衝突,採用衝突的處理辦法,就會使雜湊表變得更加複雜。

下面展示如何實現乙個雜湊表,這裡用陣列代替雜湊表元素(在在真實情況下,大多數語言的實現中,大多數元素都是乙個特別的陣列,每個元素對應乙個位址),每個陣列元素作為乙個位址。

public

class entry

}

public

class

hashtable

entry e = table[index];

if (e.next == null)

}else

}//不存在相同的值,直接向鍊錶中新增元素

entry temp = table[index].next;

entry newentry = new entry(key, value, temp);

table[index].next = newentry;

size ++;}}

/*** 刪除

*@param key

*/public

void

remove( int key) }}

}/**

* 獲取

*/public

intget(int key) }}

}return -1;

}/**

* 獲取雜湊表中元素的個數

*/public

intsize()

/*** 本身雜湊表是不該有這個方法的,在這裡只是為了清楚地看到確實擴容了。

*@return

*/public

intgetlength()

/*** 根據key,通過雜湊函式獲取位於雜湊表陣列中的哪個位置

*@param key

*@return

*/public

inthash(int key)

/*** 擴容

*/public

void

resize()

table[index].next = new entry(next.key, next.value, table[index].next);

//可以用下面三行代替

// entry temp = table[index].next;

// entry newentry = new entry(next.key, next.value, temp);

// table[index].next = newentry;

entry = next;}}

}

}

}

public

class hashtabletest

}

筆記 演算法複習筆記 陣列 集合 雜湊表(上)

陣列是資料結構中最基礎的儲存方式之一,集合是陣列的延伸,雜湊表,又稱雜湊表 hash table 許多高階語言中都是在陣列的基礎上實現的,當然還有其他實現形式。1 定長 陣列的的長度是固定的,陣列的長度在宣告時候已經確定,在使用的時候發現不夠用,只能重新宣告乙個陣列 2 按照順序訪問 在訪問陣列中某...

演算法筆記陣列

資料型別 陣列名 陣列大小 int a 5 初始化時第乙個元素賦值為0全為0 1 include2 intmain 5for int i 1 i 4 i 12 13 14for int i 0 i 5 i 1718 return 0 19 int a 5 6 中間的括號不能缺。陣列大小較大 大概10...

C複習筆記(陣列的使用)

c語言不允許對陣列大小做動態定義 c語言規定只能逐個引用陣列元素,不能一次引用整個陣列 即將陣列作為乙個整體來使用 c語言中,陣列的概念有點類似數學中的集合,陣列的初始化可以使用集合形式進行初始化 在陣列上實現迴圈佇列可以很好地解決斐波那契數列問題 c編譯器對陣列訪問越界沒有警報,這樣會增加程式設計...