簡體   English   中英

在十億個節點的無向​​圖中無循環地從正好k個邊的源節點中找到目標節點的算法/方法

[英]Algorithm/Approach to find destination node from source node of exactly k edges in undirected graph of billion nodes without cycle

考慮一下,我有一個以哈希表構造的十億個節點的鄰接列表,哈希表的排列方式如下:

鍵=源節點
值= hash_table {node1,node2,node3}

輸入值來自文本文件,格式為

1,2
1,5
1,11
...等等

例如。 鍵='1'
值= {'2','5','11'}
裝置1連接到節點2,5,11

我想知道一種算法或方法,可以從無循環的十億個節點的無向​​圖中的正好k個邊的源節點中找到目標節點

例如 從節點1我只想找到節點50,直到深度3或直到3個邊緣。

我的假設是該算法找到最短路徑1-2-60-50,但是使用上述鄰接表結構如何有效地進行遍歷? 我不想使用Hadoop / Map Reduce。

我在Python中提出了以下朴素的解決方案,但效率不高。 唯一的問題是哈希表在O(1)中搜索關鍵字,因此我可以直接搜索鄰居及其十億個鄰居以獲取密鑰。 以下算法需要很多時間。

  1. 從源節點開始
  2. 使用哈希表搜索來查找密鑰
  3. 使用鄰居節點的哈希表更深一層,找到目標節點的值,直到找到節點
  4. 如果在k深度上找不到節點,則停止
&nbsp1
|
{2 5 11}
| | |
{3,6,7} {nodes} {nodes} ....個連接的節點
| | | | |
{nodes} {nodes} {nodes} ....百萬個連接的節點。


請提出建議。 以上類似於BFS實施的算法需要3個多小時才能搜索所有可能的鍵值關系。 可以用其他搜索方法減少嗎?

正如您所暗示的,這將在很大程度上取決於系統的數據訪問特性。 Trincot所言 ,如果您僅限於單元素訪問,那么您將真正陷入困境 但是,如果您可以管理塊訪問,那么就有機會進行並行操作。

但是,我認為這超出了您的控制范圍:哈希函數擁有鄰接特征-實際上,可能會“悲觀”(與“優化”相反)該特征。

我確實看到了一個可能的希望:使用迭代而不是遞歸,維護要訪問的節點列表。 在列表上放置新節點時,獲取其哈希值。 如果您可以按位置組織群集的節點,則可以進行塊傳輸,一次讀取操作即可訪問多個值。

暫無
暫無

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

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