Определение лексикографического порядка?

Сейчас я читаю о функции std::next_permutation и столкнулся с термином " лексикографический порядок». В то время у меня не было никакого опыта работы с этим термином, поэтому я поискал его в Google и нашел только несколько загадочных определений этого типа заказа, включая статью в вики (по крайней мере, они для меня).

Так может ли кто-нибудь попытаться помочь мне понять это? Что для вас «хорошее» определение этого термина?

Что касается вики-статьи - они утверждают, что лексикографический порядок также известен в алфавитном порядке, но по мере чтения я понимаю, что это не одно и то же. Таким образом, продолжающееся сравнение меня немного смущает.


person Community    schedule 24.11.2017    source источник
comment
Удобное чтение: en.cppreference.com/w/cpp/algorithm/lexicographical_compare   -  person user4581301    schedule 24.11.2017
comment
То, что вы нашли статью в Википедии загадочной, не совсем полезное описание проблемы. Stack Overflow предназначен для конкретных задач, а не для конкуренции со статьями в Википедии по общим темам информатики.   -  person Christian Hackl    schedule 24.11.2017
comment
Я немного подумал и считаю, что статью в Википедии действительно стоило бы переформулировать. Вероятно, следует подчеркнуть аспект обобщения, прежде чем вводить алфавитный порядок в качестве синонима.   -  person Christian Hackl    schedule 24.11.2017
comment
@step Если ваш вопрос относится к перестановке символов, я надеюсь, что связанный вопрос решит его для вас. В противном случае, пожалуйста, отредактируйте, чтобы уточнить, чтобы мы могли повторно открыть его, чтобы ответить на ваш вопрос относительно std::next_permutation.   -  person Tom Blodget    schedule 25.11.2017


Ответы (3)


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

  • Если два слова имеют одинаковую первую букву, мы сравниваем вторую. Если вторые буквы совпадают, мы сравниваем третьи и т. д. Наконец, одно слово стоит перед другим, если первая отличающаяся буква стоит перед соответствующей буквой.

  • Если два слова идентичны до длины более короткого слова, более короткое слово идет первым.

Итак, «Том» предшествует «Зубу». Первые буквы идентичны («Т»), вторые буквы идентичны «о», но третьи буквы отличаются, и «м» стоит перед «о». Поэтому «Том» предшествует «Зубу».

«Том» стоит перед «Томас», потому что эти два слова идентичны по первым трем буквам «Том» и «Том» короче, чем «Томас».

Лексикографический порядок — это просто алфавитный порядок, обобщенный для небуквенных значений. Рассмотрим последовательность значений, не обязательно букв:

(1,5,10) предшествует (1,6,3), потому что "5" предшествует "6".

(1,5,10) предшествует (1,5,10,15,20), потому что (1,5,10) короче, чем (1,5,10,15,20).

Лексикографическое упорядочение особенно полезно, если элементы последовательности имеют определенное значение, причем более ранние значения имеют более высокий приоритет. Например, рассмотрим это время: 9:13 и 8:25. Если представить их в виде последовательности (9,13) и (8,25), то (8,25) предшествует (9,13), потому что 8 предшествует 9. Что, если часы одинаковы? Например, (9,13) предшествует (9,45), потому что 13 предшествует 45. Как видите, лексикографический порядок позволяет полю часов иметь более высокий приоритет, чем полю минут.

person Robᵩ    schedule 24.11.2017
comment
Спасибо, хороший ответ! Так что нет ничего плохого в том, чтобы сказать, что лексический порядок — это просто алфавитный порядок с включенными числами? Кроме того, применимы ли символы Юникода в лексикографическом порядке? - person ; 24.11.2017
comment
@шаг. Я бы сказал, что с этим что-то не так. С точки зрения символов, Алфавит представляет собой упорядоченное подмножество букв из системы письма для языка, установленного языковой академией или конвенцией. Так что это полностью зависит от языка и выбранного для него скрипта. Если бы вы указали их, вы бы определили лексикографический порядок (для этих букв). Обычно вы просто указываете набор символов, который имеет порядок кодовых точек, или кодировку символов, которая имеет порядок единиц кода. В случае Unicode не всегда один и тот же порядок: ????›$но ������‹$. - person Tom Blodget; 27.11.2017

Большинство готовых алгоритмов сортировки строк реализованы как лексикографическая сортировка. (Подробнее внизу)

Пример 1:

Случайные элементы:

['A','a','a','B','b','C','c','d','E']

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

['A','B','C','E','a','a','b','c','d']

Пример 2:

Случайные элементы разной длины:

['a', 'b', 'aa', 'c', 'ddd', 'f']

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

['a', 'aa', 'b', 'c', 'ddd', 'f']

Разница между лексикографической и естественной сортировкой

input = ["z1.txt", "z10.txt", "z3.txt", "z100.txt", "z101.txt"]

lexicogrpahic : ['z1.txt', 'z10.txt', 'z100.txt', 'z101.txt', 'z3.txt']
natural: ['z1.txt', 'z3.txt', 'z10.txt', 'z100.txt', 'z101.txt']

Мы могли бы вдаваться в подробности здесь, но многие замечательные люди уже придумали отличные объяснения для этого:

1) Есть ли у Python встроенная функция для естественная сортировка строки?

2) https://blog.codinghorror.com/sorting-for-humans-natural-sort-order/

person user1767754    schedule 24.11.2017

С точки зрения непрофессионала, это означает алфавитный порядок. На практике вы будете сортировать строки символ за символом в соответствии с их базовым числовым (обычно ASCII) представлением.

person Mureinik    schedule 24.11.2017
comment
лежащее в основе числовое представление - может ли это быть битовое представление? - person ; 24.11.2017
comment
@шаг да, вот и все - person Mureinik; 24.11.2017
comment
Ааа спасибо! Это очень понятное определение. Это подразумевается / указано где-нибудь в вики-статье? Я не могу найти это. - person ; 24.11.2017
comment
Да, за исключением контекста перестановок, алфавит имеет математическое значение, поэтому результат не совсем с точки зрения непрофессионала. И это особый случай, когда набор объектов представляет собой символы, и еще более особый случай, когда символы должны быть закодированы в ASCII. Но, если это помогает в развитии понимания, это здорово. - person Tom Blodget; 25.11.2017
comment
@TomBlodget Спасибо за вклад. Итак, вы утверждаете, что наборы объектов, которые нужно расположить по порядку, обычно не являются символами? Что еще было бы? Я имею в виду, что и буквы, и цифры считаются символами, и если да, то что бы вы еще упорядочили? - person ; 25.11.2017
comment
@step Цифра — это символ. Большинство чисел не могут быть представлены одним символом. Я не думаю, что когда-либо использовал перестановки символов (за исключением игры в Scrabble, создания анаграмм и т. д.). И хотя в компьютерном мире насчитывается более десяти тысяч букв, нам могут понадобиться некоторые перестановки из большего набора. Стандартная библиотека C++ очень тщательно отделяет алгоритмы от значений. std::next_permutation в основном требуется двунаправленная итерируемая последовательность объектов; Вы можете использовать operator < для двух объектов, если тип определяет один, или вы можете указать свой собственный. - person Tom Blodget; 25.11.2017
comment
@seth Мое последнее использование перестановок было связано с несколькими наборами размеров ящиков. (Мульти-набор — это набор значений, которые могут повторяться. std::multiset) - person Tom Blodget; 25.11.2017
comment
@TomBlodget Спасибо! - person ; 27.11.2017