簡體   English   中英

確定UTF-32編碼的字符串是否具有唯一字符

[英]Determine whether a UTF-32 encoded string has unique characters

我有一個關於使用位向量方法的問題,該方法通常用於查找字符串是否具有唯一字符。 我已經看到那些解決方案( 其中之一 )對於ASCII和UTF-16字符集可以很好地工作。

但是,相同的方法將如何用於UTF-32? 最長的連續位向量可以是Java中的長變量,對嗎? UTF-16需要1024個此類變量。 如果我們采用相同的方法,則將需要2 ^ 26個長變量(我認為)。 使用位向量可以解決這么大的字符集嗎?

我認為您在這里錯過了一些重要的事情。 UTF-32是Unicode的編碼。 Unicode實際上適合21位空間。 Unicode常見問題解答指出:

“ Unicode標准對U + 0000..U + 10FFFF范圍內的字符進行編碼,這相當於21位代碼空間。”

Unicode代碼空間之外的任何UTF-32“字符”都是無效的,並且您永遠不應在UTF-32編碼的String看到它們。 因此2 ^ 15長就足夠了。

實際上,您不太可能看到基本語言平面(平面0)之外的代碼點。 因此,將位圖用於BMP(即,代碼最多65535)和稀疏數據結構(例如, HashSet<Integer> )用於其他窗格是有意義的。

您也可以考慮使用BitSet代替使用longlong[]滾動“自己的”位集數據結構。


最后,出於兩個原因,我不應該認為鏈接到“問答”中的某些代碼不適合在UTF-16中查找唯一字符:

  • 使用long類型的N個變量和switch語句的想法無法擴展 switch語句的代碼變得龐大且難以管理……甚至可能超出JVM規范所能應付的范圍。 (已編譯方法的最大大小為2 ^ 16-1個字節的字節碼,因此顯然無法為所有Unicode代碼空間實現位向量。)

    最好使用long的數組,而無需使用switch ...這只是真正存在的原因,因為您有N個不同的long變量。

  • 在UTF-16中,每個代碼單元(16位值)對1個代碼點(字符)或一半代碼點進行編碼。 如果僅創建代碼單元的位圖,則將無法正確檢測到唯一字符。

好吧,一個long包含64位信息,而UTF-32字符集包含大約2 ^ 21個元素,這將需要2 ^ 21位信息。 如果UTF-32數據集使用所有位,則將需要2 ^ 26個長變量,這是正確的。 但是,實際上,您只需要2 ^ 13個long變量(仍然很多)。

如果您假設字符均勻分布在數據集中,那么這種低效率是不可避免的,最好的解決方案是使用Set<Long>東西。 但是,英語純文本的大部分字符都傾向於在ASCII范圍(0-127)中,並且大多數西方語言都被限制在特定范圍內,因此您可以對高頻區域和Set使用位向量或其他順序無關的,高效率的contains數據結構來表示的區域的其余部分。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM