2015-07-27 3 views
2

У меня есть проблема, мне недавно сообщили, что для неупорядоченного значения для ввода куча случайных значений позволяет сказать 1 миллион из них, что с использованием набора было бы более эффективным, чем использование вектора, а затем сортировка указанного вектора с функцией базового алгоритма сортировки, но когда я их использовал и проверил их через функцию времени, в терминале и valgrind, он показал, что и временная сложность, и использование пространства было быстрее для вектора, даже с добавлением вызываемой функции сортировки. Человек, который дал мне совет по использованию набора, намного более опытен, чем я, на языке C++, но мне всегда приходится проверять себя до того, как посоветоваться с людьми. Далее следуют тестовые коды.Который более эффективен, установлен или вектор

Для Набор

std::set<int> testSet; 
    for(int i(0); i<= 1000000; ++i) 
    testSet.insert(-i); 

Для Vector

std::vector<int> testVector; 
    for(int i(0); i<= 1000000; ++i) 
    testVector.push_back(i * -1); 

    std::sort(testVector.begin(), testVector.end()); 

Я знаю, что это не случайные величины, это не было бы справедливо, поскольку набор не допускает дубликатов, и вектор делает sothey бы различные размеры для этой базовой точки функции. Может ли кто-нибудь уточнить, почему этот набор должен использоваться, не имеет смысла ни одного дубликата.

Я тоже не делал никаких тестов с неупорядоченным набором. Не слишком уверен в различиях между двумя заданными точками.

+1

Их семантика ортогональна, поэтому просят об эффективности поведения. Сначала определите _efficiency_ для вашего прецедента. –

+1

Также обратите внимание, что способ, которым вы вставляете, ужасно неэффективен. При четности одних и тех же вставок без сохранения памяти вектор, как правило, превосходит набор из-за базовой структуры данных, что является прямым для первого. – edmz

+0

Да, я видел огромное количество бесплатных и выделенных, которые имеют место в пределах установленной структуры данных, по сравнению с 18, которые были нужны для вектора, поскольку он просто удваивается по размеру и оставляет много пустого пространства на своем пути, что может или, возможно, никогда не будет использоваться.Это было только то, что я старался быть неэффективным, насколько это возможно, с помощью вставок, но не поискать, что может быть тем, чего не хватает в этой проверке сложности, и это то, где я думаю, что набор принимает, а затем более эффективен, по крайней мере, это то, что Я собрался до сих пор. Это было сделано неправильно, чтобы наложить нагрузку на структуры данных. –

ответ

6

Это слишком расплывчато и игнорирует/пропускает несколько важных факторов. Если ваш друг сказал именно об этом, ваш друг (независимо от его или ее опыта) ошибался. Скорее всего, вы несколько неправильно интерпретируете свои слова и читаете в них упрощенную версию вопросов.

Если вы хотите отсортированный конечный продукт, сортировка «амортизируется», когда вы вставляете в набор, потому что каждый раз вы получаете небольшие биты сортировки. Если вы будете вставлять периодически и много раз, то это расширение рабочей нагрузки может быть тем, что вы хотите. Общее, при добавлении, может по-прежнему быть больше, чем для вектора (учитывайте случайное перебалансирование и т. Д., Ваш вектор просто нужно перемещать в больший блок памяти время от времени), но вы его распространили чтобы не заметно замедлить некоторые отдельные части вашей программы.

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

Вы не указали свой прецедент в какой-либо детали, поэтому я не буду притворяться, что здесь даю специфику, но единственный возможный ответ на поставленный вами вопрос - это «это зависит» и «вопрос в корне несколько бессмысленный "; вы не можете просто взять две структуры данных и методы сортировки и спросить «что более эффективно?» без использования случай. У вас, однако, правильно измеряется времени и пространства, и если вы сделали это против своего реального случая использования, то, ну, у вас есть ответ, не так ли?

+0

Спасибо за это. Я собираюсь удалить вопрос, хотя при некотором простом поиске удалось найти довольно описательную ситуацию «за» и «против». Еще раз спасибо. Даже если вы не можете увидеть этот комментарий. –

+4

@ L.P .: Пожалуйста, нет. Я просто потратил свое время и энергию, отвечая на это для вас, и для других, которые могут прийти позже. Зачем вам немедленно уйти и удалить его из мира? Это не делает меня правильно, и это не так. Это также один шаг по пути к автоматизированному вопросу, требующему запрета (см., Что не только я ненавижу такое действие!) –

+0

Смутно в данный момент. Почему нет? –

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