Мне невозможно понять метод поиска строк, как описано.Что такое UFFFF? - PullRequest
6 голосов
/ 27 января 2012

Я читаю что-то о поиске (диапазона) строк в отсортированном массиве строк.

Там написано:

Если вы хотите найти все строки, начинающиеся с «h», вы можете запустить двоичный поиск для строк "h" и "h \ uFFFF". Это дает все индексы группы для всех ключей, которые начинаются с "h". Обратите внимание, что бинарный поиск может вернуть индекс, где строка будет, даже если на самом деле его нет в массиве.

Я ничего не понимаю из этого абзаца.

Что такое h\uFFFF как это помогает / используется в бинарном поиске и означает ли последнее предложение, что даже этот поиск является ошибочным?

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

Ответы [ 4 ]

9 голосов
/ 27 января 2012

\ uFFFF - это "символ", который сортируется последним в 16-разрядном "алфавите", то есть после любой действительной буквы, символа или специального символа.

Когда вы выполняете двоичный поиск строки вотсортированный массив, вы найдете место, где эта строка может быть вставлена.Когда у вас есть несколько одинаковых строк, вы получаете местоположение перед первым.Когда вы добавляете «последнюю букву алфавита» после вашей строки, точка вставки будет после последней из идентичных строк, следовательно, вы получите диапазон идентичных строк в отсортированном массиве.

Представьте себе это:Предположим, вы не можете использовать букву Z в ваших словах.Теперь у вас есть отсортированный массив строк:

0   1   2   3   4   5   6
aab abb abc abc abd bcx bdy

Если вы ищете abc, бинарный поиск покажет вам первое место, где вы можете вставить его, а именно 2. Если вы ищете abcZ, thoug, бинарный поиск вернул бы 4, потому что abcZ идет в алфавитном порядке сразу после abc.Это позволяет вам знать, что диапазон между 2 включительно и 4 исключительно занят строкой abc.Если оба поиска возвращают одно и то же число, вы знаете, что строка отсутствует в массиве.

В приведенном вами абзаце \uFFFF играет роль "запрещенной буквы Z" из моего примера.

3 голосов
/ 27 января 2012

\uFFFF - это максимально возможный символ в Java. Так как строки отсортированы, поиск h найдет начало диапазона, в то время как h\uFFFF найдет конец (при условии, что здесь используются строки Юникода), так как ни один второй символ не может быть больше \uFFFF. Даже если она не может точно соответствовать строке, поиск вернет индекс того, где цель будет , даже если ее нет на самом деле.

update: \uFFFF - это самый большой из возможных сортируемых символов Юникода в 16-битном блоке, если вы работаете с 32-битными блоками, используйте U+10FFFF (что бы это ни было в Java). Лично я никогда не работал с 32-битными блоками Юникода в Java. См. Раздел 16.7 из спецификации 5.2.0 .

U + FFFF и U + 10FFFF. Эти две нехарактерные кодовые точки имеют атрибут связан с самыми большими значениями единицы кода для конкретные формы кодирования Unicode. В UTF-16 ассоциируется U + FFFF с наибольшим значением 16-битной кодовой единицы, FFFF . U + 10FFFF это связанный с наибольшим допустимым значением единицы UTF-32 32-битного кода, 10FFFF. Этот атрибут отображает эти две нехарактерные кодовые точки полезно для внутренних целей в качестве стражей. Например, они могут быть используется для указания конца списка, для представления значения в индексе гарантированно будет выше любого допустимого значения символа и т. д.

2 голосов
/ 27 января 2012

Последовательность \uFFFF в Java обозначает символ с кодовой точкой Unicode U + FFFF.Однако кодовая точка вообще не кодирует символ:

U + FFFF используется для представления числового значения, которое гарантированно не является символом, для таких применений, как конечное значение в концеиндекса.

См. Эти ссылки: Технический отчет Unicode # 16 , это таблица символов Unicode и определение этого символа .

1 голос
/ 27 января 2012

Как указали другие ответы, при поиске h будет найдено начало диапазона строк, начиная с h, а h\uFFFF найдет конец (исключая) диапазона строк, начинающихся с hв вашем наборе данных.

Последнее предложение означает, что поиск h\uFFFF покажет вам, где вы должны вставить такую ​​строку, если она не существует в ваших данных, поэтому она дает вам эксклюзивконец вашего диапазона.

...