Структура данных_Проблемы, связанные с последовательностью реализации алгоритма, таблица_12

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).

Acho que você gosta

Origin blog.csdn.net/qq_56866000/article/details/132030519
Recomendado
Clasificación