問題描述:給定乙個陣列a,任務是設計乙個演算法求得陣列中的「主元素」,即在陣列中個數超過陣列總元素個數一半的元素。但是陣列中元素的資料型別可能是複雜型別,這意味著陣列中的元素進能夠比較是否相等而不存在序關係,設對於兩個元素a[i]和a[j],判定是否a[i]=a[j]需要常數時間。
注意,在陣列中超過總數一半的元素若存在,一定只有乙個。
(a) 設計乙個時間複雜性為o(n log n)的演算法解此問題
(b) 設計乙個時間複雜性為o(n)的演算法解此問題.
1.列舉法
遍歷陣列,求出每種元素的個數,得到主元素。
2.分治法
如果存在主元素a[i],則將陣列等分為a1[n/2]和a2[n/2],主元素必為至少乙個子陣列的主元素。這是因為a[i]不可能都不是子陣列的主元素。因此可以採用分治法,直到分解的子陣列長度為1或者2。
分治法的時間複雜度為o(nlogn)。
3.刪除不同元素
對整個陣列,從a[0]開始,每次刪除兩個不同的元素。這樣會出現三種情況:
(1)刪除了兩個主元素;
(2)刪除了乙個主元素乙個非主元素;
(3)刪除了兩個非主元素。
但是由於主元素佔一半以上,相當於用主元素去匹配非主元素,最終剩下的元素全一樣時停止刪除,剩下的就是主元素。這種方法的時間複雜度為o(n)。
歡迎使用CSDN markdow
本markdown編輯器使用stackedit修改而來,用它寫部落格,將會帶來全新的體驗哦 markdown 是一種輕量級標記語言,它允許人們使用易讀易寫的純文字格式編寫文件,然後轉換成格式豐富的html頁面。維基百科 使用簡單的符號標識不同的標題,將某些文字標記為粗體或者斜體,建立乙個鏈結等,詳細...
歡迎毛毛與妞妞使用CSDN markdown編輯器
建立乙個自定義列表 如何建立乙個註腳 注釋也是必不可少的 katex數學公式 新的甘特圖功能,豐富你的文章 uml 圖表 flowchart流程圖 匯出與匯入 你好!這是你第一次使用markdown編輯器所展示的歡迎頁。如果你想學習如何使用markdown編輯器,可以仔細閱讀這篇文章,了解一下mar...
歡迎使用CSDN markdow1n編輯器
本markdown編輯器使用stackedit修改而來,用它寫部落格,將會帶來全新的體驗哦 markdown 是一種輕量級標記語言,它允許人們使用易讀易寫的純文字格式編寫文件,然後轉換成格式豐富的html頁面。維基百科 使用簡單的符號標識不同的標題,將某些文字標記為粗體或者斜體,建立乙個鏈結等,詳細...