2010-05-19 1 views
1

Это для задания и находится в psuedo-коде.Подсчет дубликатов (не обязательно удаление) в массиве в O (n)

Мне нужно найти, сколько целых чисел в массиве уникально, ничего другого, но оно должно быть в O (n), желательно без хеширования.

Спасибо!

+4

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

+0

Я полагаю, что не должен. Большой проблемой было найти k-й наибольший элемент в массиве, значения не ограничены. Я использовал разделение вместе с функцией для поиска медианы. для удаления/подсчета дубликатов я думал об использовании линейной сортировки, так как я знаю, что значения слева от раздела меньше медианы, но мне нужен O (n) худший случай, тогда я думал о хэшировании, но мы не имеем " Это еще не достигнуто. – Mosho

+0

@Mosho "линейная сортировка" - ошибка. существует линейный поиск. – Andrey

ответ

1

А как насчет этого псевдокода?


array randomNumbers; 
array unique; 
int uniqueCount = 0; 

for (i in randomNumbers) { 

    unique[i] += 1; 
    uniqueCount++; //count all here 
    // and remove duplicities here 
    if (unique[i] > 1) { 
    uniqueCount--; 
    } 
} 
return uniqueCount; 

И premis в том, что необъявленная уникальная [я] является 0

+0

Я думаю, что это так, спасибо! – Mosho

+0

@Mosho: Аналогичный метод можно использовать для [сортировки массива в O (n + k)] (http://en.wikipedia.org/wiki/Counting_sort) –

+0

Это именно то, что я изначально имел в виду, но это было недостаточно. – Mosho

0

Просто перебирайте каждый элемент в массиве и отслеживайте элементы, которые видите, когда вы видите дубликат, сообщите об этом.

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

+2

OMG. и какова сложность «отслеживания»? – Andrey

+0

Я думаю, вы имеете в виду какое-то хеширование? Это то, о чем я думал, по крайней мере, но я не думаю, что это разрешено. – Mosho

+0

Я был на самом деле, думая что-то более похожее на то, что Moravec отправил, используя другой массив, чтобы «отслеживать». И @ Andrey, вы можете отслеживать элементы таким образом без лишней сложности. – adhanlon