簡體   English   中英

在PHP中是否存在替代數據結構而不是數組,我可以從不同的索引技術中受益?

[英]Are there alternative data structures than array in PHP, where I can benefit from different index techniques?

最近我遇到了一個包含數十萬個值的數組的問題,我唯一想做的就是檢查一個值是否已經存在。 在我的例子中,這是來自網絡服務器日志的IP。 所以基本上是這樣的:

in_array(ip2long(ip),$myarray)完成了這項工作

然而,查找時間急劇增加,10k的查找大約需要17秒左右。

所以在這種情況下,我並不關心我是否有重復,我只需要檢查是否存在。 所以我可以將IP存儲在索引中,如下所示:

isset($myarray[ip2long($ip)])

繁榮,查找時間從17秒(或更多)下降到靜態時間0.8秒,進行10k查找。 作為數組條目的值,我剛使用了int 1

我認為數組索引可能基於一些b-tree,它應該有log(n)查找時間和hashmap上的索引。

在我的情況下使用索引工作正常,但有沒有任何數據結構,我可以使用哈希映射作為值索引,其中多個值也可能會出現(我意識到這只有意義,如果沒有太多的重復,我不能使用范圍/搜索請求有效,這是樹結構的主要好處)?

在與PHP捆綁的SPL庫中,除了簡單數組之外,還有一系列替代數據結構,包括鏈表,堆棧,堆,隊列等。

但是,我懷疑如果你翻轉你的數組,你可以使你的邏輯效率更高,允許你對鍵進行查找(使用array_key_exists()函數)而不是搜索值。 數組索引是散列而不是btree,可以通過密鑰進行非常快速的直接訪問。

但是,如果您正在使用數組中的10k條目,則可能更好地利用數據庫,您可以在其中定義自己的索引。

你還有chdb (常量哈希數據庫)擴展 - 這是完美的。

數組具有順序順序,並且可以快速訪問某些元素,因為您不需要遍歷樹或通過順序列表結構。

這里的集合當然更快,因為您只檢查唯一元素而不是所有元素(在數組中)。

Tree在示例排序結構中很好用。 您可以使用按其范圍排序的IP來實現樹,然后如果此IP存在與否,您可以更快地決定。 我不確定PHP是否提供了這樣的自定義樹結構。 我猜你自己需要實現這個,但這需要大約半個小時。

您可以在Web上找到此類樹結構的示例代碼。

如前所述,您可以使用spl http://www.php.net/spl提供的全新類

但顯然他們沒有人們想象的那么快。 可能他們沒有像我們期望的那樣實施。 我認為splfixedarray不是一個真正的數組,而是一個哈希表作為經典的php數組

但是,你也有一些替代解決方案

首先,您可以將結果存儲在數據庫中。 查詢很快,因為db索引可能比php數據結構更好地優化

您可以使用http://www.php.net/sqlite3並將結果存儲在臨時數據庫(文件或內存)中

我建議一個臨時文件,因為你不必在內存中加載所有內容,而在plus中你可以單獨添加每一行(例如使用http://www.php.net/fgets

HTH!

隨意糾正我的英語

暫無
暫無

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

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