2012-08-11 89 views
2

我有一些數據需要存儲並高效查找。優選使用C. 數據文件的每一行是按以下格式:3查找值的有效方法int

key1 key2 key3 data 

其中key1key2key3是整數,且datafloat陣列。

我的想法轉換成key1,2,3一個字符串,然後用C++ std::map串映射到一個浮動指針:

std::map<string, float*> 

有沒有更好的做這件事的方法嗎?

注意:整數鍵1,2,3的範圍是0-4000,但是非常稀疏。換句話說,如果你經歷了key1中的所有值,你會在0-4000範圍內發現100個唯一的int。

+3

你打算使用C還是C++? – AusCBloke 2012-08-11 01:29:18

+4

可用於C的解決方案和可用於C++的解決方案非常不同。你說「最好使用C」,但繼續建議使用'std :: map'的C++實現。你真的想要哪種語言? – 2012-08-11 01:32:27

+0

如果你要去C++一個包含所有三個鍵的類與一個比較運算符,其中包含邏輯以正確比較它們的最小公共順序中的鍵將是好 – 2012-08-11 01:34:24

回答

1

分層圖,將做到這一點:

map<int, map<int , map<int, list<float> > > > records; 

並且訪問時間將是很好的(對數)。 如果範圍很寬,這種方法會很有效。否則,4000以前答案中給出的建議班次更快,更有效。

2

你不必使用字符串,如果每個鍵的數據限制是從0到4000

第一生成組合鍵如下:

unsigned long ulCombinedKey = key1 + key2<<12 + key3 <<24; 

後,您可以使用地圖作爲你已經在你的問題中說過。

+0

不幸的是,在32位機器上沒有足夠的位數來完成這項工作,但它對於64位數據類型可以很好地工作。 – 2012-08-11 01:42:31

+0

@GregHewgill:注意他使用'+'而不是'|',所以雖然不一定(非常)獨特,但他所做的基本上是一個散列碼,它應該仍然是幾乎唯一的(即很少碰撞)。同時,爲確保唯一性,您仍然需要原始密鑰進行比較。 – 2012-08-11 01:47:15

+0

感謝球員,他似乎有一個更好的解決方案,但我打算提出一個不是C++的C解決方案,但似乎他對C++也很好。 – 2012-08-11 02:05:26

5

您可以使用std::tuple三個值組合成一個:

std::map<std::tuple<int, int, int>, float *> 
+0

我會認爲使用手卷類作爲關鍵如果它有已知的限制,可以幫助優化比較順序。目前還不僅僅是元組提升(實際上)?不再瞭解基於Windows的編程人員了 – 2012-08-11 02:04:31

0

散列提供對數據的快速讀取,所以你可能需要使用散列從每三個整數的查找值。這種方法可以用於c或C++。

對於數據的每一行: 1.浮子陣列 2.存儲的指針到浮標的陣列中的指針數組分配空間 3.存儲在哈希指針數組的索引基於上INT1 4.存儲在哈希指針陣列的基礎上在INT2上 5.存儲索引基於INT3

這種方式在哈希指針數組的索引,給定INT1,INT2,或int3,可以查找指針數組索引,檢索指針,然後按照指針指向浮點數組。這種方法使用了一些內存,但不是太多,因爲問題是int1,int2和int3中每個都有100個唯一值。

相關問題