簡體   English   中英

比較兩個字符串的前三個字符

[英]Compare first three characters of two strings

字符串s1和s2的長度始終為1或更高。

我怎樣才能加快速度呢?

int l1 = s1.length();

if (l1 > 3) { l1 = 3; }

if (s2.startsWith(s1.substring(0,l1))) 
{
 // do something..
}

正則表達式可能嗎?

這似乎很合理。 這對你來說真的太慢了​​嗎? 你確定這不是過早的優化嗎?

重寫以避免對象創建

你的直覺是正確的。 新對象(substring())的創建速度不是很快,這意味着每個創建的對象也必須產生g / c開銷。

這可能會快得多:

static boolean fastCmp(String s1, String s2) {
    return s1.regionMatches(0, s2, 0, 3);
}
if (s2.startsWith(s1.substring(0, Math.min(3, s1.length())) {..};

順便說一句,它沒什么緩慢的。 startsWith具有復雜度O(n)

另一種選擇是比較char值,這可能更有效:

boolean match = true;
for (int i = 0; i < Math.min(Math.min(s1.length(), 3), s2.length()); i++) {
    if (s1.charAt(i) != s2.charAt(i)) {
       match = false;
       break;
    }
}

我的java不太好,所以我會在C#中給你一個答案:

int len = Math.Min(s1.Length, Math.Min(s2.Length, 3));
for(int i=0; i< len; ++i)
{
    if (s1[i] != s2[i])
       return false;
}
return true;

請注意,與您和Bozho的不同,這不會創建一個新的字符串,這將是您的算法中最慢的部分。

也許你可以做到這一點

if (s1.length() > 3 && s2.length() > 3 && s1.indexOf (s2.substring (0, 3)) == 0)
{
  // do something..
}

這里缺少上下文:你想要掃描什么? 什么類型的申請? 預計運行的頻率如何?

這些很重要,因為不同的場景需要不同的解決方案:

  1. 如果這是一次性掃描,那么這可能是不必要的優化。 即使對於20MB的文本文件,在最壞的情況下也不會超過幾分鍾。
  2. 如果您有一組輸入,並且每個輸入都在掃描20MB文件中的所有單詞,那么對20MB文件進行排序/索引可能更容易查找匹配並跳過99%的不必要比較。 此外,如果輸入傾向於重復,那么使用緩存可能是有意義的。

其他解決方案也可能是相關的,具體取決於實際問題。

但是,如果你把它歸結為只比較兩個字符串的前3個字符,我相信這里給出的代碼片段和你將得到的一樣好 - 它們都是O(1)*,所以沒有大幅優化你可以做。

*唯一可能不成立的地方是,如果獲取字符串的長度是O(n)而不是O(1)(這是C ++中strlen函數的情況),這不是Java和C#字符串對象。

暫無
暫無

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

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