ibm最後有道求主元素的題目,乙個陣列有n個元素,其中有超過n/2的元素相同,請找出這個元素。時間複雜度為o(n)方法1:如果乙個元素的個數超過n/2則這個元素必然是這n個元素的中位數。則這個題目是找中位數。方法是通過快速排序變化的來的演算法。
**如下:做這個題目複習了下快排,選擇乙個pivot,然後圍繞這個pivot將陣列分成兩部分,左邊一部分的元素都小於pivot,右邊部分的元素都大於pivot,然後遞迴的處理左右兩個部分,直到陣列元素個數為1.找第k小元素的方法是基於快排的分割函式,將乙個陣列分割成兩部分。如果小於pivot的元素個數a小於k,則在分割後的陣列的右邊找第k-a小的元素,否則在左邊部分找。對於中位數就是第n/2小的數。根據演算法導論的說明,快排的平均演算法複雜度為o(nlogn),而找第k小元素的平均演算法複雜度為o(n)。找k小的演算法和快排的不同在於快排需要遞迴處理左邊和右邊兩個部分,即複雜度方程為: o(1) n = 1 t(n)={ 2t(n/2) n> 1而對於求第k小數,只需要遞迴處理乙個分支,所以複雜度方程為: o(1) n = 1t(n)={ t(n/2) n> 1雖然只比快排少了個係數2,但是可以推導出來求第k小數的複雜度為o(n),而快排為o(nlogn)方法2:求眾數的方法:對於找主元素的題目,還有其他的做法,可以使用求眾數的方法,首先選擇乙個pivot,然後將陣列分割成兩部分,左邊的小於pivot,右邊的大於pivot在分割過程中統計陣列中等於pivot的元素個數,小於pivot的元素個數以及大於pivot的元素個數。如果pivot的元素個數大於等於n/2,則pivot就是所求元素。如果小於pivot的元素個數大於等於n/2,則在左邊部分找,否在在右邊部分找。**為:在統計pivot出現次數時需要注意是在交換i,j對應元素時判斷的。因為只有當array[i]>=x並且array[j]<=x才需要交換元素。同時當退出while(i關於這種主元素還有種更加巧妙地方法,沒看到過一定想不到的。這種方法的原理是如果乙個陣列中存在乙個主元素(個數大於n/2),則同時刪除兩個不相等的值,這個主元素不會改變。
簡單的說就乙個大小為n陣列中存在乙個元素的個數大於n/2,則如果用這個陣列中其他元素和該主元素進行抵消的話,最後剩下的一定是主元素,因為主元素個數最多。
該方法可以在o(n)的時間內找到主元素,十分高效。
**:
關鍵的演算法在找seed過程中,假設第乙個元素是主元素,遍歷陣列,如果遇到和seed相同的元素則加1,不同則減1,如果count==0了,則seed改變。
該方法的基礎就是如果存在乙個值是主元素,那麼遍歷一遍則出現的次數一定要大於其他所有元素的次數,所以最後主元素的count一定大於0.
有序陣列尋找中位數以及尋找K大元素
問題描述 兩個排序的陣列a和b分別含有m和n個數,找到兩個排序陣列的中位數,要求時間複雜度應為o log m n 轉化成找到兩個陣列的第k大數字進行解決 解題方法 對於乙個長度為n的已排序數列a,若n為奇數,中位數為a n 2 1 若n為偶數,則中位數 a n 2 a n 2 1 2如果我們可以在兩...
快速排序 QuickSort 中位數實現
注意事項 quicksort data,seq,low org,low 1 quicksort data,seq,low 1,high org 遞迴函式quicksort中最後遞迴呼叫的時候,因為 中位數的值pivot已經處於陣列中的正確位置,因此 必須採用 low 1 和 low 1,這樣才能不斷...
題目1157 中位數 快速排序思想
題目1157 中位數 時間限制 1 秒 記憶體限制 32 兆 特殊判題 否 提交 1526 解決 910 題目描述 中位數定義 一組資料按從小到大的順序依次排列,處在中間位置的乙個數 或最中間兩個資料的平均數 給出一組無序整數,求出中位數,如果求最中間兩個數的平均數,向下取整即可 不需要使用浮點數 ...