2011-03-01 4 views
5

Я хочу разработать алгоритм, определяющий, является ли массив A множественным, и вернуть этот элемент.Divide and conquer - Plural Array

Массив множественный, если в массиве существует элемент x, если более половины массива совпадает с x.

Мне интересно, есть ли более эффективный алгоритм разделения и покорения, который работает лучше, чем текущий, который у меня есть сейчас.

Assume you have the array 

aaabbcac 

i будет рекурсивно разделять массив до тех пор, пока я не получу подмассивы размером 2, как показано ниже.

aa ab bc ac 

отсюда, я буду сравнивать каждый элемент в Подмассив, чтобы увидеть, если они равны: Если РАВНО, возвращает элемент, Иначе, вернуть ложь.

aa ab bc ac 
a f f f 

так что теперь у меня есть массив элементов A и 3 false.

я думал комбинируя их таким образом:

a f f f 
    a  f <----- combining a and f will give a 
    a <----- returns a 

Но, если мы посмотрим на массив, мы имеем 4 А, которая не соответствует критериям множественного массива. Он должен возвращать false, если массив не будет множественным массивом.

Я считаю, что мой алгоритм будет работать в O (n lgn), если он будет правильным алгоритмом, которого, к сожалению, нет.

Может ли кто-нибудь указать мне в правильном направлении?

+0

Должен ли быть подход к разделению и завоеванию? – gusbro

+0

Да, я ищу алгоритм разделения и покорения. – ali

+0

Это домашнее задание? Вы были очень близки ... –

ответ

1

Это проблема подсчета числа вхождений x. Разделите массив на вспомогательные массивы и отправьте x вместе с дополнительными массивами. Возвращает счетчик, подсчитывает количество и проверяет, больше ли размер массива.

+0

Что вы имеете в виду отправить x вместе с дополнительными массивами? – ali

+0

Вместо отправки вспомогательных массивов, таких как 'aa ab bc ac', посылает tupples вспомогательного массива и элемент' (aa, a), (ab, a), (bc, a), (ac, a) ' –

+0

ah i see , так что это означает, что x, который я посылаю с помощью вспомогательных массивов, будет случайным элементом, или это будет элемент, который находится в подмассиве, в этом примере aa – ali

1

Вы также можете отсортировать массив по некоторому алгоритму сортировки (например, quicksort) после этого цикла до (N + 1)/2 элемента, проверив, является ли элемент n + 1 таким же, как n. При использовании quicksort такой подход будет со сложностью O(n*log n + n/2). Таким образом, в основном мой алгоритм будет связан скоростью сортировки.

+0

А я вижу .. но предполагаю, что могу сравнивать элементы в массиве только на основе равенства. То есть, я не могу определить, являются ли элементы меньше или больше друг друга. Кроме того, возможно ли, чтобы алгоритм был типом разделения и завоевания? – ali

+0

Хорошо. Кажется, мы не можем использовать метод сортировки с такими требованиями. Что об этом - построить гистограмму элементов, если какой-то элемент имеет относительную частоту больше 0,5 - массив является множественным. Сложность Algo будет зависеть от сложности поиска/вставки таблицы гистограмм. Или этот подход также нарушает правило без ограничений/больше? (потому что нам еще нужно проверить частоту больше 0,5) :-) –

+0

, если элементы сопоставимы, алгоритм не ограничен скоростью сортировки. –

1

Поскольку это домашнее задание, вот подсказки - вы должны быть в состоянии доказать это легко и закончить вопрос.

  • Один элемент массива тривиальным имеет множественный элемент
  • Массив имеет не более одного элемента множественного числа, предположим, что он существует и называем его х.
  • Если вы разделите массив на две половины, x будет представлять собой элемент множественного числа как минимум один из половин.
+0

Привет Крис! Это то, что я получил до сих пор. Требование состоит в том, чтобы он был алгоритмом разделения и покорения. Поэтому я разбиваю массив на подмассивы из 2 элементов. 'Сравнить 2 элемента, Если EQUAL, сохраните его в другом массиве Если НЕ РАВНО, отбросьте два элемента.' после прохождения всех элементов, у меня будет новый массив. в примере, который я дал 'aa ab bc ac ===> приводит к наличию в новом массиве.' , но поскольку в массиве всего 4 а, это не множественный массив. таким образом, мне придется снова пройти через массив, чтобы проверить, является ли этот элемент множественным элементом. – ali

+0

Итак, будет ли проверка O (n) проверки сложностью алгоритма? или это будет O (nlgn) из-за стадии деления алгоритма. – ali

+0

Вы так близко. Вы * всегда будете снова запускать массив, чтобы проверить. Например, если ваш массив является aaaabbbb, и вы делите и побеждаете в aaaa | bbbb, эти подмассивы являются множественными (a и b), и вы * имеете *, чтобы считать a и b, чтобы проверить, нет ли множественного числа в оригинале. Вы были правы, это O (n lg n) - это шаг проверки (проверка всех n элементов, на уровне lg n уровней подразделения). –

Смежные вопросы