序言名單:這個問題應該是中性語言,它是關於算法,但是爲了更學術的問題,因爲這是我最喜歡的語言,我會寫的例子在C++。如何有效CPU增加項目的唯一項目
試想以下結構簡單:
struct Item
{
char Char;
std::string String;
};
現在,我有這些項目的清單,說std::vector<Item> list
。我想要的是創建一個函數,允許我將項目添加到此列表中,但是如果該項目已經在列表中,則跳過。所以它只包含每個項目一次。這使我想到的最簡單的實現:
void AppendItem(Item item)
{
// Check if the item is in the list and if yes, exit the function
foreach (Item x, list)
{
// Compare char first, because comparing 2 chars is as CPU complex as comparing 2 numbers
if (item.Char != x.Char)
continue;
// Now we can compare the strings, which is relatively complex operation
if (item.String == x.String)
return;
}
// There clearly isn't any such item in a list, so let's add it
list.push_back(item);
}
到目前爲止,它看起來是一個愚蠢的問題,這實際上是。但現在它變得更有趣。
想象已經有列表中的2000項,我要添加更多的1000。我不知道這1000箇中的任何一個是否已經在列表中。
如果我遞歸地使用這個啞函數,我會導致循環每個項目2000 + N(N爲0 - 999)* 1000。給定字符串比較的實現,這非常慢。即使在我的i7 CPU上也很慢。
有沒有更聰明的算法,我該如何做到這一點?只要CPU吃得少,我甚至可能會犧牲一些RAM。
downvote的原因是什麼? – Petr