集合元素問題 初識hash

2021-10-22 16:39:11 字數 743 閱讀 6813

假設現在要存乙個陣列a[1,7,20000000,3289,10]

很簡單,你可將他們存在a陣列裡。

但這樣查詢就會很不方便,尤其是當數很多的時候,你要開著迴圈一遍遍找(當然也可以採用二分)

或者你又說為了能o(1)找到這個數是否存在,你可用打勾陣列。即讀進來5,在a[5]=1;

但如果讀進來乙個很大的數,假設是1000000,你就要開乙個很大的陣列在a[1000000]=1;但其實最後只有三個數,你卻開了這麼大乙個陣列,豈不是浪費?

這就要用到hash了

hash[mod]=a[i]

mod就是n%乙個貼近他的素數(數學家寫了很長的證明,來證明%素數,衝突的機率會小一些)

那你可能就要問了:餘數萬一一樣,不就衝突了嗎?

沒錯,我們可以使用鍊錶,或者是向量來處理這些衝突。

以%13為例

集合元素,也不用多說了吧,標準hash

細節在**中:

#include using namespace std;

int main()

cin>>bn;

int b[bn+5];

int ans=0;

for(int i=1;i<=bn;i++) }

cout<

return 0;

}

主元素問題

主元素 majority number 定義為陣列中出現次數嚴格超過一半的數。找到這個數。要求使用o 1 的額外空間和o n 的時間。初階 有n個數,其中乙個數的出現次數嚴格超過了一半。求這個數。高階1 有n個數,其中兩個數的出現次數都超過了 求這兩個數。高階2 有n個數,其中乙個數的出現次數嚴格超...

主元素問題

設a是含有n個元素的陣列,如果元素x在a中出現的次數大於n 2,則稱x是a的主元素。給出乙個演算法,判斷a中是否存在主元素。因為主元素的個數大於n 2,如果兩個不同的元素兩兩抵消,最後若完全抵消,那麼就不存在主元素 若沒有完全抵消,那麼餘下的元素可能就是主元素,因此統計該元素的出現次數,即可判定是否...

主元素問題

主元素問題歡迎來到二陽的學習課堂,咱們先看一看問題描述 1.問題分析 當長度為n的序列a 現次數大於n 2的元素,則此元素為主元素。設主元素出現k次,則其他元素出現次數為n k 二者之差為c 2k n 但c 0時,主元素成立。2.演算法設計 從序列a前端開始遍歷,初始化主元素a a 0 計算遍歷過程...