Какой самый эффективный способ сортировать коллекцию предметов в ведра?

StackOverflow https://stackoverflow.com/questions/4373187

  •  09-10-2019
  •  | 
  •  

Вопрос

У меня есть массив произвольных хэшей с элементом хеша целого числа (вызовите это «ID»). Я хочу отсортировать эти хэши в ряд ведер (постоянные над массивом), где каждое ведро является произвольным диапазоном «IDS» (например, 1-10, 15-20, 20-30). Какова лучшая сортировка стратегия для этого? Можно ли обойтись без вложенного цикла?

Это было полезно?

Решение

Если количество ведер маленькое, вам, вероятно, лучше с помощью вложенных петель. Внешняя петля по хэшам и внутренне над ведрами. O(n*m).

Если количество хэшей, и количество ведер больших, вы можете:

hashes = sort(hashes)
buckets = sort(buckets) # sort by lower-bound of bucket
i = 0

foreach (hash in hashes) {
  while (buckets[i].lower_bound > hash) {
    i = i + 1
  }
  bucket[i].add(hash)
}

В основном петли через хэши добавляют их в текущее ведро и продвигаются к следующему ведрю при необходимости. O (n * log (n) + m * log (m))

Другие советы

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

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

Вы не упоминаете язык / платформу, но для эффективного с точки зрения нажатий клавиш (C #):

        var histogram = new[] { 0, 10, 15, 20, 30, 40 };
        var values = new[] { 12, 14, 5, 6, 7, 1, 34, 26, 17 };
        var bars = values.GroupBy(v => histogram.First(b => v < b));
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top