私はこの問題を解決するために取り組んでいますが、いくつかの記事を見ている間、ムーアの投票アルゴリズムを使って時間複雑度O(n) 大多数の要素は、配列のサイズを2で割った値よりも大きい要素です。 次のo(lg n)時間は、私のコードがo(lg n)であるかどうかを示唆してください。 私はプログラミングに非常に新しいので、私は提案を歓迎します。O(lg n)tieの複雑さでソートされた配列のマジリティ要素を見つけよう
#include <bits/stdc++.h>
#include <algorithm>
using namespace std ;
int binarySearch(vector <int> a, int l, int h){
if(l - h < a.size()/2)
return -1;
int mid = (l+h)/2;
int temporaryLow = mid;
int temporaryHigh = mid;
while(temporaryLow > 0 && a[temporaryLow] == a[mid])
temporaryLow--;
while(temporaryHigh < a.size() && a[temporaryHigh] == a[mid])
temporaryHigh++;
if((temporaryHigh -1) - (temporaryLow+1) +1 >= a.size()/2){
return a[mid];
}else{
return max(binarySearch(a,0,temporaryLow),binarySearch(a,temporaryHigh,h));
}
}
int findMajority(vector <int> numbers){
return binarySearch(numbers , 0, numbers.size());
}
int main()
{
int n ;
vector <int> a ;
while ((cin >> n) && n != 9999)
a.push_back(n);
int majority = findMajority(a);
cout << majority ;
}
、アレイ内の中間要素は、大部分の要素でなければなりません。 (ソートされた配列では、同じ要素が連続していますが、配列の要素の半分以上を中心を避けて置くことができますか? – rici
これはO(1)です。配列に多数の要素があるかどうかわからない場合は、候補の多数要素のインスタンスが十分にあることを確認する必要があります。その確認にO(log N)がかかります – rici
こんにちは@riciは、私のコードがO(log N)を取っているかどうかを教えてください。あるいは、私の配列に多数の要素があるかどうかわからないときは、 – Yagnesh