今天實現的演算法是尋找多數元素,多數元素是指在乙個含有n個元素的序列**現次數多於[n/2](向下取整)的元素。
蠻力尋找多數元素是對每個元素進行計數,如果某個元素的計數超過[n/2],則斷言它是多數元素,否則不存在多數元素。這種方法的時間複雜度過高,可以尋找更高效能的演算法解決這類問題。
如果乙個序列存在多數元素,那麼該多數元素一定是該序列排序後的中間元素,也就是第[n/2](向上取整)個元素。所以可以通過尋找乙個序列的中間元素,然後判斷該元素是否為多數元素來尋找多數元素。對於此方法,有乙個結論可以使用:
在原序列中去除兩個不同元素後,那麼在原序列中的多數元素在新序列中還是多數元素。
這個結論可以支援乙個尋找多數元素候選者的演算法,該演算法的偽**如下:
演算法:candidate
輸入:n個元素的陣列a[1...n]
輸出:多數元素的候選元素
candidate(m)
j ← m
c ← a[m]
count ← 1
while j < n and count > 0:
j ← j + 1
if a[j] = c then
count = count + 1
else
count = count - 1
end if
end while
if j == n then return c
else return candidate(j+1)
在尋找到候選多數元素後,只需要對該元素進行計數,判斷是否為多數元素,該演算法偽**如下:
演算法:majority
輸入:n個元素的陣列a[1...n]
輸出:若存在多數元素,則輸出;否則輸出none
c ← candidate(1)
count ← 0
for j ← 1 to n:
if a[j] == c then
count = count + 1
end if
end for
if count > [n/2] then return c
else return none
下面是三種**的實現,首先是c++版本:
#include
#define type int
#define none int_min
using namespace std;
type candidate(type *a, int n, int m) else else else ;
cout << "輸入陣列為:\n";
for (int i = 1; i <= 13; i ++) else else else ;
majoritylist ml = new majoritylist();
system.out.println("輸入陣列為:");
for (int i = 0; i < a.length; i++) {
system.out.print(a[i]);
system.out.print(" ");
ml.add(a[i]);
system.out.println();
boolean result = ml.hasmajorityelement();
system.out.print("是否存在多數元素? ");
system.out.println(result);
if (result) {
system.out.print("多數元素為:");
system.out.println(ml.getmajorityelement());
最後是python實現:
#! /usr/bin/env python
# -*- coding:utf-8 -*-
class majoritylist:
def __init__(self):
self._list = list()
self.hasmajority = false
self.majority_value = 0
def candidate(self, m):
j = m
c = self._list[m]
count = 1
while j < len(self._list)-1 and count > 0:
j = j + 1
if self._list[j] == c:
count += 1
else:
count -= 1
if j == len(self._list)-1:
return c
else:
return self.candidate(j+1)
def majority(self):
c = self.candidate(1)
count = 0
for j in range(1, len(self._list)):
if self._list[j] == c:
count += 1
if count > (len(self._list)-1)/2:
self.hasmajority = true
self.majority_value = c
else:
self.hasmajority = false
self.majority_value = 0
def add(self, x):
self.hasmajority = false
self.majority_value = 0
def hasmajorityelement(self):
self.majority()
return self.hasmajority
def getmajorityelement(self):
return self.majority_value
if __name__ == '__main__':
a = [1, 2, 5, 5, 5, 4 ,3 ,2, 5, 5, 4, 5, 5]
ml = majoritylist()
print '輸入陣列為:'
for i in a:
print i,
ml.add(i)
result = ml.hasmajorityelement()
print '是否存在多數元素?', result
if result:
print '多數元素為:', ml.getmajorityelement()
分享到:
2012-03-09 16:17
瀏覽 1520
python尋找多數元素 尋找多數元素 演算法
定義 整型陣列a 1.n 如果整數x在陣列a 現的次數多於半數,則x稱為多數元素 應用概念 觀察結論5.1 在原序列中去除兩個不同的元素後,那麼在原序列中的多數元素在新序列中還是多數元素。例1 1,2,2,3,2,2,3 顯然2是多數元素 去除1,2,在2,3,2,2,3中2仍是多數元素 去除1,3...
實驗一 尋找多數元素
實驗一 尋找多數元素 實驗題目1 尋找多數元素 10.11日實驗 要求 1 分別設計普通演算法和歸納法演算法,2 寫出 並除錯成功 3 給出乙個存在多數元素的陣列作為例子,執行 輸出結果 在乙個整數序列裡,當某個元素a出現的次數多於 n 2 的底數,則為多數元素。暴力法 把每個元素與其他的相比較,並...
尋找多數元素 使用尋找候選者的方法。
尋找陣列中的多項元素有多種辦法,直接暴力迴圈或者是先排序後尋找中間元素最壞的時間複雜度為nlogn。幾天記錄乙個使用候選者的方法去尋找陣列中的多項元素時間複雜度則為n n即為n 與直接遍歷迴圈查詢最大的不同點是,尋找候選者的過程中我們定義乙個count值,當遍歷時陣列值與我們的候選值相等時count...