1. Описание проблемы:
Известно, что целочисленная последовательность A= (a0, a1< a i=4>,..., an-1), где 0<=ai =……=a< / a> <n,1<=k<=m), то x называется главным элементом A. Например, если А (0, 5, 5, 3, 5, 7, 5, 5), то 5 — главный элемент; а если А = (0, 5, 5, 3, 5, 1, 5, 7 ), то A В . нет основного элемента. Предположим, что n элементов в A хранятся в одномерном массиве. Разработайте максимально эффективный алгоритм для поиска основных элементов A. Если есть основной элемент, выведите его; в противном случае выведите -1. Требования:k=x и m>n/2 (0<=ppmp2=ap1<n (0<=i<n). Если существует a
- Приведены основные идеи построения алгоритма.
- Согласно замыслу алгоритм описывается на языке C или C++ или Java, а также даются комментарии по ключевым моментам.
- Опишите временную и пространственную сложность разработанного вами алгоритма.
2. Алгоритмическое мышление:
Стратегия алгоритма заключается в том, чтобы сканировать элементы массива спереди назад, отмечая элемент Num, который может стать основным элементом. Затем посчитайте еще раз, чтобы убедиться, что Num является основным элементом.
- Сначала выберите кандидата на главный элемент. Просканируйте каждое целое число в заданном массиве последовательно, сохраните первое встреченное целое число Num в c и запишите номер вхождения Num как 1; если следующее встретившееся целое число все еще равно Num, добавьте 1 к счетчику, в противном случае счетчик уменьшается. на 1; когда счетчик уменьшается до 0, следующее встретившееся целое число сохраняется в c, счетчик сбрасывается на 1, и начинается новый раунд счета, то есть описанный выше процесс повторяется с текущей позиции до тех пор, пока все элементы массива сканируются. .
- Затем определите, является ли элемент c настоящим главным элементом. Снова просканируйте массив и подсчитайте количество вхождений элемента в c. Если он больше n/2, это главный элемент, в противном случае в последовательности нет главного элемента.
3. Код алгоритма:
int Majority(int A[],int n)
{
int i,c,count = 1;//c用来保存候选主元素,count用来计数
c = A[0];//设置A[0]为候选主元素
for(i = 1;i < n;i++)//查找候选主元素
{
if(A[i] == c)
count++;//对A中的候选主元素计数
else
{
if(count > 0)//处理不是候选主元素的情况
count--;
else//更换候选主元素,重新计数
{
c = A[i];
count = 1;
}
}
}
if(count > 0)
{
for(i = count = 0;i < n;i++)//统计候选主元素的实际出现次数
{
if(A[i] == c)
count++;
}
}
if(count > n/2)
return c;//确认候选主元素
else
return -1;//不存在主元素
}
4. Сложность алгоритма:
- Временная сложность: O(n).
- Пространственная сложность: O(1).