2014-09-08 2 views
-3

Я пытаюсь написать алгоритм сортировки для следующей неупорядоченной карты. Я видел this вопрос, и я пытаюсь реализовать его для неупорядоченной карты, но она не работает!Как получить медианное значение на неупорядоченной карте?

Примечание. Мне не разрешено использовать какие-либо функции сортировки STL.

void quickSort(unordered_map<string, int> map, unordered_map<string, int>::iterator left,unordered_map<string, int>::iterator right) { 

    unordered_map<string, int>::iterator i=left; 
    unordered_map<string, int>::iterator j=right; 
    unordered_map<string, int>::iterator pivot = std::advance(map.begin(), map.size()/2); 

    unordered_map<string, int> tmp; 
} 

int main(){ 
    unordered_map<string, int> map; 
    map["blah"] = 2; 
    map["the"] = 5; 
    quickSort(map,map.begin(),map.end()); 
} 
+3

Вы ** не можете ** сортировать 'неупорядоченный_мап' на месте. Вам необходимо перенести значения в другой контейнер (например, «вектор»). –

+0

@ KonradRudolph любая причина? – Bernard

+0

Просто из любопытства: Почему вам не разрешено использовать 'std :: sort()' вообще? Это какая-то домашняя работа? – TobiMcNamobi

ответ

2

Как указано в комментариях, вы не можете сортировать unordered_map на месте, потому что его value_type является std::pair<const Key, T> (обратите внимание на const!) Для unordered_map<Key,T>. Это означает, что вы не можете менять элементы на карте, поэтому вы не можете их отсортировать. Вам нужно будет скопировать данные в другой структуры данных, как вектор, то вы можете использовать некоторые «доморощенные» версию std::nth_element на нем:

std::vector<std::pair<Key,T>> med {map.begin(), map.end()}; 
my_nth_element(med.begin(), med.end(), med.begin() + med.size()/2); 
auto median = med[med.size()/2]; 

Вы должны реализовать свои nth_element с линейной сложностью в среднем. (Если количество входных значений является четным, вам нужно использовать среднее значение обоих средних значений.)

2

Неупорядоченная карта не имеет порядка (как следует из названия), и таким образом найти медиану в неупорядоченной карте не имеет смысла. Если вам нужно найти медиану - используйте вспомогательный массив и выполните некоторую реализацию алгоритма nth_element. Этот шаг будет с линейной сложностью.

+0

Я пытаюсь написать функцию сортировки для неупорядоченной карты ... – Bernard

+0

@Bernard вы не можете написать функцию сортировки для неупорядоченной карты, так как это не сделает ее дольше ** неупорядочен **. –

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