我正在阅读有关在排序的字符串数组中搜索字符串(范围)的内容。
上面写着:
如果要查找以"h“开头的所有字符串,可以对字符串"h”和"h\uFFFF“进行二进制搜索。这为以"h“开头的所有键提供了带的所有索引。注意,即使字符串实际上不在数组中,二进制搜索也可以返回字符串所在的索引。
这一段我什么也不懂。
h\uFFFF
是什么?它如何帮助/在二进制搜索中使用?最后一个句子是否也意味着即使这个搜索也是错误的?
能帮我理解一下这里说的话吗?
发布于 2012-01-27 16:04:57
\uFFFF是16位“字母表”中最后排序的“字符”,即在任何有效字母、字符或特殊符号之后。
在对排序数组中的字符串进行二进制搜索时,可以找到可以插入该字符串的位置。当您有多个相同的字符串时,就会在第一个字符串之前得到一个位置。当您在字符串后面追加“字母表的最后一个字母”时,插入点将位于最后一个相同字符串的后面,从而在排序数组中给出一系列相同的字符串。
想象一下:假设你不允许在你的单词中使用字母Z
。现在,您有了一个排序的字符串数组:
0 1 2 3 4 5 6
aab abb abc abc abd bcx bdy
如果您搜索abc
,二进制搜索将告诉您可以插入它的第一个位置,即2。如果搜索abcZ
,thoug,二进制搜索将返回4,因为abcZ
按字母顺序排列在abc
后面。这使您知道字符串abc
占用了2 (包括)和4 (独占)之间的范围。如果两个搜索都返回相同的数字,则知道数组中不存在字符串。
在你引用的段落中,\uFFFF
扮演了我的例子中的“禁止字母Z”的角色。
发布于 2012-01-27 16:03:26
\uFFFF
是Java中最大的可能字符。由于字符串是排序的,搜索h
将找到范围的开始,而h\uFFFF
将找到结束(假设这里是unicode字符串),因为没有第二个字符比\uFFFF
大。即使它不能与字符串完全匹配,搜索也会返回目标位置的索引,即使目标不在那里。
更新:\uFFFF
是16位块中最大的可排序unicode字符,如果您正在使用32位块,请使用U+10FFFF
(不管在Java中是什么)。我个人从未在Java中工作过32位unicode块。参见http://www.unicode.org/versions/Unicode5.2.0/ch16.pdf的第16.7节。
U+FFFF和U+10FFFF.这两个非字符代码点的属性是与特定Unicode编码窗体的最大代码单元值相关联。在UTF-16中,U+FFFF是与最大16位代码单位值相关联的FFFF .U+10FFFF与最大的合法UTF-32位代码单位值10 10FFFF相关联.此属性将这两个非字符代码点作为哨兵呈现为内部用途。例如,可以用来表示列表的结尾,表示保证高于任何有效字符值的索引中的值,等等,。
发布于 2012-01-27 16:08:59
Java中的\uFFFF
序列表示使用Unicode编码点U+FFFF的字符。但是,代码点根本不编码字符:
U+FFFF用于表示保证不为字符的数值,用于索引末尾的最后值等用途。
参见以下参考资料:Unicode技术报告#16、这个Unicode字符图表和这个字符定义。
https://stackoverflow.com/questions/9036241
复制相似问题