14 Алгоритмы сортировки и массивы PHP

В этой статье я расскажу вам о бенчмарке алгоритмов сортировки, написанном на PHP. Представлено 14 алгоритмов:

  • быстрая сортировка
  • подсчетСортировка
  • гребенчатая сортировка
  • heapSort
  • Сортировка слиянием
  • оболочкаСортировать
  • выборСортировка
  • вставкаСортировка
  • гномСортировка
  • комбинированная пузырьковая сортировка
  • коктейльСортировать
  • пузырьковая сортировка
  • нечетная-четная сортировка
  • пузырекSortWithFlag

Алгоритмы расположены не в алфавитном порядке, а в порядке убывания скорости их выполнения при сортировке массива из 8 тысяч элементов.

Представлены следующие размерности массивов, используемые для сортировки:

  • 1
  • 100
  • 200
  • 400
  • 600
  • 800
  • 1000
  • 5000
  • 10000
  • 15000
  • 20000
  • 25000
  • 30000

Каждое измерение выполнялось с разным заполнением массива, которое передается в функцию сортировки.

  • В первом случае массив был заполнен случайными значениями с интервалом (1, n), где n — размерность массива. 963 или около 9.2233720368548E+18

Каждое измерение было выполнено трижды и получено среднее арифметическое

Массивы до 1000 элементов

В этой категории задействованы все функции сортировки.

Массивы до 30 тысяч элементов

В данном случае задействованы 5 самых быстрых алгоритмов: счетная, быстрая, гребенчатая, куча и сортировка слиянием.

Массивы до 200 тыс. элементов

В данном случае задействованы те же 5 алгоритмов: счетная, быстрая, гребенчатая, куча и сортировка слиянием.

Массивы до 2 миллионов элементов

В последнем раунде из 2 миллионов элементов использовались два алгоритма: сортировка по счету и быстрая сортировка.

Резюме

QuickSort по праву считается неплохим алгоритмом. CountingSort действительно хорош в небольших диапазонах значений; в противном случае он не может управлять из-за нехватки памяти. Коктейльная сортировка оказалась плохим выбором для случайных значений. Пузырьковый сорт и его модификации не применимы к практическому использованию.

Исходный код всех алгоритмов + результаты: https://drive.google.com/file/d/0B63HSL7JD630VWdSSFgwdHR5RkU/edit?usp=sharing

В качестве забавного упражнения используйте встроенную функцию сортировки. Построение функции сортировки в интерпретируемом коде PHP никогда не будет быстрее, чем вариант C, который использует sort().

cursor.sort() — Руководство по MongoDB

Главная Документация → Руководство MongoDB

На этой странице

  • Определение
  • Поведение
  • Примеры
  • Возврат в естественном порядке

Определение 90 141

cursor.sort(sort)

Важный

монгош Метод

На этой странице описан метод mongosh . Это , а не . документация для драйвера для конкретного языка, такого как Node.js.

Драйверы API MongoDB см. в документации для конкретного языка. Документация драйвера MongoDB.

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

Метод sort() имеет следующий параметр:

Параметр

Тип

Описание

сортировка

документ

Документ, определяющий порядок сортировки набора результатов.

Параметр sort содержит пары полей и значений в в следующей форме:

{ поле: значение }

Документ сортировки может указывать сортировку по возрастанию или по убыванию на существующие поля или сортировать текстовые метаданные оценки.

Поведение

Ограничения

Вы можете сортировать не более чем по 32 ключам.

Согласованность сортировки

Изменено в версии 4.4 .

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

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

Рассмотрим следующую коллекцию ресторана :

Park Cafe», «район»: «Манхэттен «},
{ «_id»: 2, «name» : «Rock A Feller Bar and Grill», «район» : «Queens»},
{ «_id»: 3, «name» : «Empire State Pub», «район» : «Бруклин»},
{ «_id» : 4, «имя» : «Stan’s Pizzaria», «район» : «Манхэттен»},
{ «_id» : 5, «имя» : «Джейн Гастроном», «район» : «Бруклин»},
] );

Следующая команда использует метод sort() для сортировки. в поле borough :

db.restaurants.find().sort( { «borough»: 1 } )

В этом примере порядок сортировки может быть неверным стойкий, начиная с

р-н поле содержит повторяющиеся значения для обоих Манхэттен и Бруклин . Документы возвращаются в алфавитном порядке по номеру р-н , но порядок этих документов с повторяющимися значениями для района может не быть одинаковым для нескольких исполнений одного и того же вида. Например, вот результаты двух разных исполнений вышеуказанной команды:

{ «_id» : 3, «name» : «Empire State Pub», «borough» : «Brooklyn» }
{ » _id» : 5, «name» : «Jane’s Deli», «район» : «Brooklyn» }
{ «_id» : 1, «name» : «Кафе Central Park», «район» : «Манхэттен» }
{ «_id» : 4, «name» : «Stan’s Pizzaria», » район» : «Манхэттен» }
{ «_id» : 2, «имя» : «Rock A Feller Bar and Grill», «район» : «Квинс» }
{ «_ идентификатор» : 5, «name» : «Jane’s Deli», «район» : «Brooklyn» }
{ «_id» : 3, «name» : «Empire State Pub», «borough» : «Brooklyn» }
{ «_id» : 4, «name» : «Stan’s Pizzaria», «район» : «Манхэттен» }
{ «_id» : 1, «имя» : «Кафе Центрального парка», «район» » : «Манхэттен» }
{ «_id» : 2, «имя» : «Rock A Feller Bar and Grill», «район» : «Квинс» }

В то время как значения для района 9014 5 по-прежнему отсортированы в алфавитном порядке, порядок документов, содержащих повторяющиеся значения по р-н (например, Манхэттен и Бруклин ) не одно и то же.

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

borough и поле _id :

Поле _id всегда гарантированно содержит исключительно уникальные значения, возвращаемый порядок сортировки всегда будет одинаковым для несколько исполнений одного и того же вида.

Сортировка по возрастанию/убыванию

Укажите в параметре сортировки поле или поля для сортировки и значение 1 или -1 для указания сортировки по возрастанию или по убыванию соответственно.

Следующая операция сначала сортирует документы по полю age в порядке убывания, а затем по полю сообщений в порядке возрастания:

db.users.find({}).sort({ age : -1, posts: 1 } )

При сравнении значений разных типов BSON MongoDB использует следующий порядок сравнения, от низшего к высшему:

  1. MinKey (внутренний тип)

  2. Null

  3. Числа (целые, длинные, двойные, десятичные)

    90 006
  4. Символ, Строка

  5. Объект

  6. Массив

  7. BinData

  8. ObjectId

  9. Логический

  10. Дата

  11. Отметка времени

  12. Регулярное выражение

  13. MaxKey (внутренний тип)

Подробнее о порядке сравнения/сортировки для определенных типов см.

Сравнение/порядок сортировки.

Text Score Metadata Sort

Для поиска $text вы можете сортировать по убыванию оценки релевантности используя выражение { $meta: "textScore" } .

В следующем образце документа указана сортировка по убыванию "textScore" метаданные:

 90 211
db.users.find(
{ $text: { $search: "operating" } },
{ оценка: { $meta: "textScore " }} // Необязательно, начиная с MongoDB 4.4
).sort({ score: { $meta: "textScore" } })

Метаданные "textScore" сортируются в порядке убывания.

Дополнительные сведения см. в разделе $meta .

Использование сортировки и индекса

MongoDB может получать результаты операции сортировки из индекса, который включает поля сортировки. MongoDB может использовать несколько индексов для поддержки операция сортировки , если сортировка использует те же индексы, что и запрос предикат.

Если MongoDB не может использовать индекс или индексы для получения сортировки порядок, MongoDB должна выполнить операцию блокирующей сортировки данных. Блокирующая сортировка указывает, что MongoDB должна потреблять и обрабатывать все входные документы для сортировки перед возвратом результатов. Блокирующие сортировки не блокировать одновременные операции над коллекцией или базой данных.

Операции сортировки, использующие индекс, часто имеют более высокую производительность, чем блокирующие сорта. Для получения дополнительной информации о создании индексов для поддержки операции сортировки см. в разделе Использование индексов для сортировки результатов запроса.

Если MongoDB требует использования более 100 мегабайт системной памяти для блокирующая операция сортировки, MongoDB возвращает ошибку , если запрос указывает cursor.allowDiskUse() ( Новое в MongoDB 4.4 ). allowDiskUse() позволяет MongoDB использовать временные файлы на диске для хранения данных, превышающих лимит системной памяти в 100 мегабайт. при обработке операции блокирующей сортировки.

Чтобы проверить, должна ли MongoDB выполнять сортировку с блокировкой, добавьте cursor.explain() на запрос и проверьте объяснить результаты. Если план запроса содержит этап SORT , то MongoDB должен выполнить блокировка операции сортировки при ограничении памяти в 100 мегабайт.

Чтобы блокирующая сортировка не потребляла слишком много памяти:

  • Создайте индекс для поддержки операции сортировки. Видеть Используйте индексы для сортировки результатов запроса для получения дополнительной информации и Примеры.

  • Ограничить количество данных для сортировки с помощью cursor.limit() с cursor.sort() . См. Ограничение результатов для получения дополнительной информации. Информация и примеры.

См. также:

Ограничения памяти для операций сортировки

Ограничение результатов

Вы можете использовать sort() в сочетании с limit() для возврата первого (с точки зрения сортировки порядка) тыс. документов, где тыс. - заданный лимит.

Если MongoDB не может получить порядок сортировки с помощью сканирования индекса, тогда MongoDB использует алгоритм сортировки top-k. Этот алгоритм буферизует первые тыс. результатов (или последних, в зависимости от порядка сортировки), увиденных до сих пор доступ к базовому индексу или коллекции. Если в какой-то момент память размер этих тыс. результатов превышает 100 мегабайт, запрос будет ошибка , если запрос не указывает cursor.allowDiskUse() ( Новое в MongoDB 4.4 ).

См. также:

Ограничения памяти для операций сортировки

Взаимодействие с проекцией

Когда набор результатов отсортирован одновременно и по прогнозу, механизм запросов MongoDB всегда будет применить сортировку сначала .

Примеры

Коллекция заказы содержат следующие документы:

{ _id: 1, item: { категория: "торт", тип: "шифон" }, количество: 10 }
{ _id: 2, элемент: { категория: "печенье", тип: "шоколадная стружка" }, количество: 50 }
{ _id: 3, item: { категория: "печенье", тип: "шоколадная стружка" }, количество: 15 }
{ _id: 4, item: { категория: "торт", тип: "лимон" }, количество: 30 }
{ _id: 5, пункт: { категория: "торт", тип: "морковь" }, количество: 20}
{ _id: 6, пункт: { категория: "домовые", тип: "блонди" }, количество: 10 }

Следующий запрос, который возвращает все документы из заказов коллекция, не указывает порядок сортировки:

db. orders.find()

Запрос возвращает документы в неопределенном порядке:

 9018 7 { «_id»: 1, «элемент»: { «категория»: « торт", "тип" : "шифон" }, "количество" : 10 }
{ "_id" : 2, "предмет" : { "категория" : "печенье", "тип" : "шоколадная стружка" }, «количество»: 50}
{ «_id»: 3, «элемент»: { «категория»: «печенье», «тип»: «шоколадная стружка» }, «количество»: 15 }
{ "_id" : 4, "предмет" : { "категория" : "торт", "тип" : "лимон" }, "количество" : 30 }
{ "_id" : 5, "предмет" : { "категория" : "торт", "тип" : "морковь" }, "количество" : 20 }
{ "_id" : 6, "предмет" : { "категория" : "пирожные" ", "type" : "blondie" }, "amount": 10 }

Следующий запрос определяет сортировку поля amount в в порядке убывания.

db.orders.find().sort({ сумма: -1})

Запрос возвращает следующие документы в порядке убывания количество :

 9021 1
{ "_id" : 2, "предмет" : { "категория" : "печенье", "тип" : "шоколадная стружка" }, "количество" : 50 }
{ «_id»: 4, «предмет»: { «категория»: «торт», «тип»: «лимон» }, «количество»: 30}
{ «_id»: 5, «предмет»: { "категория" : "торт", "тип" : "морковь" }, "количество" : 20 }
{ "_id" : 3, "предмет" : { "категория" : "печенье", "тип " : "шоколадная стружка" }, "количество" : 15 }
{ "_id" : 1, "предмет" : { "категория" : "торт", "тип" : "шифон" }, "количество" : 10 }
{ "_id" : 6, "item" : { "category" : "brownies", "type" : "blondie" }, "amount" : 10 }

Следующий запрос определяет порядок сортировки с использованием полей из встроенный документ пункт . Сначала запрос сортируется по полю категории . в порядке возрастания, а затем внутри каждой категории по типу поле в порядке возрастания.

db.orders.find().sort( { «item.category»: 1, «item.type»: 1 } )

Запрос возвращает следующие документы, упорядоченные сначала по категория поле и внутри каждой категории по типу поле :

{ «_id» : 6, «item» : { «category» : «брауни», «type» : «blondie» }, «количество»: 10 }
{ «_id»: 5, «предмет»: { «категория»: «торт», «тип»: «морковь» }, «количество»: 20 }
{ «_id» : 1, «предмет» : { «категория» : «торт», «тип» : «шифон» }, «количество» : 10}
{ «_id» : 4, «предмет»: { «категория»: «торт», «тип»: «лимон» }, «количество»: 30}
{ «_id»: 2, «предмет»: { «категория»: «куки» «, «тип» : «шоколадная крошка» }, «количество» : 50 }
{ «_id» : 3, «предмет» : { «категория» : «печенье», «тип» : «шоколадная крошка» }, «количество» : 15 }

Возврат в естественном порядке

Параметр $natural возвращает элементы в соответствии с их естественный порядок в базе данных.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *