由於您正在接收文本正文以流式方式進行搜索,因此對「預處理」文本以進行更有效的搜索沒有任何意義。這是C#中的一種高效實現,它處理要以流式方式搜索的文本。
static IEnumerable<int> Search(string text, string query)
{
var D = new Dictionary<int, int>();
//Loop invariant: D[i] == j iff text[i..(i+j)] == query[0..j]
// for all pairs (i,j) in D
for (int i = 0; i < text.Length; i++)
{
foreach (var k in D.Keys.ToList())
{
D[k] = D[k] + 1;
if (D[k] == query.Length)
{
yield return k;
D.Remove(k);
}
else if (text[i] != query[D[k]])
{
D.Remove(k);
}
}
if (text[i] == query[0])
D.Add(i, 0);
}
foreach (var k in D.Keys)
{
if (D[k] == query.Length)
yield return k;
}
}
基於流式的版本可以如下實現。我認爲流式結束的情況可能無法正確處理,但即使在這種邊緣情況下,您也應該能夠將這個想法適應於某種可行的方式。
class SearcherState
{
public Dictionary<int, int> D = new Dictionary<int, int>();
public int i = 0;
}
static Func<char, int?> Searcher(string query)
{
var state = new SearcherState();
return c =>
{
int? result = null;
foreach (var k in state.D.Keys.ToList())
{
state.D[k] = state.D[k] + 1;
if (state.D[k] == query.Length)
{
result = k;
state.D.Remove(k);
}
else if (c != query[state.D[k]])
{
state.D.Remove(k);
}
}
if (c == query[0])
state.D.Add(state.i, 0);
state.i++;
return result;
};
}
你會考慮任何這些解決方案的最佳? http://stackoverflow.com/questions/6606581/find-repeated-word-in-infinite-stream-of-words –
@OzzieGooen你提到的問題是,雖然你可能會發現相關的,是完全不同的,因爲它要求報告只能使用散列表處理的重複項。 – Sankalp
既然你不知道查詢語句是什麼,如果只有一個查詢,那麼假設你有一個流是沒有意義的;你必須記住迄今爲止所看到的所有數據。或者,您可能會在不同時間收到多個查詢,而流仍在進行中?我猜我可以理解。或者你可能想要做一些類似連續線性時間工作的流,因爲當查詢進來時,你可以比O(n)更快地解決問題? – user2566092