實驗一:尋找多數元素
實驗題目1:尋找多數元素 (10.11日實驗) 要求:
(1)分別設計普通演算法和歸納法演算法,
(2)寫出**,並除錯成功
(3)給出乙個存在多數元素的陣列作為例子,執行**,輸出結果
在乙個整數序列裡,當某個元素a出現的次數多於(>)【n/2】的底數,則為多數元素。
暴力法:
把每個元素與其他的相比較,並計數,如果count>【n/2】的底數,則為多數元素。時間複雜度為o(n
2n^2
n2)。還有一種就是將其排序,如果存在多數元素,則陣列中間的值a【n/2】就是多數元素。取得這個值後還要掃瞄一遍確定count是大於【n/2】底數的。
觀察結論1:
在序列去除兩個不同(劃重點)的元素後,原序列的多數元素在新序列還是多數元素。
簡單解釋一下,一撥是給多數元素,另一撥是非多數元素。去掉兩個不同,第一種多數元素去乙個,非多數去乙個,還是多數元素;第二種多數不動,非多數去掉兩個,多數還是不變。第三種從多數元素去掉兩個,但是相同,所以與前提不符合。
演算法基本原理:
從第乙個元素開始,我們給它乙個count=1;代表當前元素已經有乙個了。
(1)下乙個元素如果與它相等,則count+1;
(2)不等,就count-1
如果所有元素都掃瞄完畢,且最終count>0則該元素作為候選多數元素返回。如果在沒有掃完的時候,count=0了,則從後乙個元素開始遞迴呼叫函式。返回的候選元素仍然需要再掃一遍陣列,看其個數是否大於【n/2】的底數。
元素不相等的時候,count-1相當於去除兩個元素,也就是抵消,當前和下乙個與它不相等的就抵消掉。count=0則這個元素被抵消掉了,從下乙個元素再開始。
#include
#define max 1000
#define none 0
using
namespace std;
intmajority1
(int
*a,int n)
if(count>
(n/2))
//大於n/2就是多數元素
return i;
}return none;
}int
candidate
(int
*a,int m,
int n)
if(j==n)
return c;
else
return
candidate
(a,j+
1,n)
;//從抵消後的一位開始
}void
majority2
(int
*a,int n)
int
main()
python尋找多數元素 尋找多數元素
今天實現的演算法是尋找多數元素,多數元素是指在乙個含有n個元素的序列 現次數多於 n 2 向下取整 的元素。蠻力尋找多數元素是對每個元素進行計數,如果某個元素的計數超過 n 2 則斷言它是多數元素,否則不存在多數元素。這種方法的時間複雜度過高,可以尋找更高效能的演算法解決這類問題。如果乙個序列存在多...
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...
演算法之道 尋找多數元素演算法(Java)
定義 整型陣列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,...