主要元素求法及優化

2021-08-20 02:21:18 字數 1035 閱讀 1863

在一本書中,我看到這樣一道題:已知乙個陣列中有乙個元素的出現次數佔所有元素個數一半以上,找出這個元素。

我想:真簡單!

是的,兩個for迴圈能解決的問題,的確不能說難。

但是,兩個for迴圈的確有些浪費,效率也奇低,有點兒「拿不出手」,所以我開始思索如何簡化演算法(日常思索):

突然我心生一計:既然出現的頻率這麼高,那我對這個陣列排完序,出現在中間的數不就是這個主要元素嗎?

假設陣列為:5 4 3 3 3 2 3 1 3

排完序後為:1 2 3 3 3 3 3 4 5

這樣這個演算法的時間複雜度就完全取決於我排序演算法的時間複雜度了

真是令人振奮呢:排序有三種不同時間複雜度的:

1. 桶排序       複雜度o(n)

2. 氣泡排序 複雜度o(n^2)

3. 快排 複雜度o(nlogn)

當然這裡只推薦快排,因為我們給出的數值範圍不確定,這樣桶排序極其容易浪費掉大量記憶體,也是「拿不出手」的。

但是快排的時間複雜度也不能說是很低,能不能更加簡化呢?比如說o(n)或者o(logn)?

好吧,我們是理智人,o(logn)就有點逆天,畢竟讀入陣列就不止這個複雜度了。

所以我們重點討論o(n)的情形:

消除法:因為佔的」份額」實在是多,所以主要元素就是與其他元素一一消除,最終剩下的數也絕對是主元素,所以我們可以考慮用這個方法來「消」出這個主要元素。

這樣我們就創造乙個計數器k,當遇到相同元素+1,不同減一,很容易知道最終結果必為正數。不過中間過程中會遇到為0的情況,這樣我們就初始化k的值,並且把他的指向儲存到下一位就行了。

在指完整個陣列後,最近儲存的指向肯定就是主要元素啦!(想想為什麼)

**附上:

#include int main()

; int book = 1;//提供消除依據

int i = 0;

int num = 0;//記錄當前比較的數

scanf("%d",&n);

for(i=0; i

乘法逆元及逆元求法

模運算 取餘運算,即a除以b得到的餘數,記為mod,又記為 模運算過程中,加減乘都可以先對a,b進行 p,然後再進行加減乘,最後再 p,結果不變 運算子優先順序,模運算和乘除法的運算子優先順序是一樣的 同餘 a和b除以p得到的餘數相同,即p可以整除 a b 求解 cfrac mod p 的值,因為除...

2 19 找出主要元素

大小為 n 的陣列 a,其主要元素是乙個出現次數超過n 2 的元素 從而這樣的元素最多有乙個 例如,陣列 3,3,4,2,4,4,2,4,4 有乙個主要元素,而陣列 3 3,4 2,4 4,2 4沒有主要元素。如果沒有主要元素,那麼你的程式應該指出來。下面是求解該問題的乙個演算法概要。首先找出主要元...

XSLT主要元素2

1 元素 定義和用法 元素用於在輸出中把樣式表中的命名空間替換為不同的命名空間,換句話說,使用其他字首替換與給定命名空間關聯的字首。注釋 是頂層元素 top level element 且必須是 或 的子元素。例子 輸入xml文件 用於轉換的xslt文件 輸出的轉換結果 結果顯示 命名空間發生了變化...