You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中实现节点关联带权无向边查询的高效数据结构选型咨询

Efficient Data Structure for Querying Node Edges in an Undirected Weighted Graph

Hey there! Let's tackle this problem—you need a way to quickly look up all edges (and their integer values) connected to a given node in an undirected graph, right?

Core Requirements Recap

We need a structure that:

  • Stores undirected weighted edges (so each edge X-Y with value v needs to be reflected in both X's and Y's edge lists)
  • Lets us fetch all edges for a node in near-instant time
  • Is efficient to build and update as needed

The Best Fit: Hash Table (Dictionary) of Adjacency Lists/Dictionaries

The most efficient and straightforward data structure here is a hash map (dictionary) where each key is a node, and the value is either:

  1. A list of tuples representing connected nodes and their edge values
  2. A nested dictionary mapping connected nodes directly to their edge values

Both options give O(1) average-time complexity for looking up a node's edges, which is exactly what we need for fast queries.

Example Implementation (Using Python)

Let's map your sample graph:

  • A connected to B (value 1)
  • B connected to C (value 2)
  • B connected to D (value 2)
Option 1: List of Tuples

This is great if you just need to iterate through all connected edges without frequent lookups for specific neighbors:

# Initialize the graph
graph = {
    'A': [('B', 1)],
    'B': [('A', 1), ('C', 2), ('D', 2)],
    'C': [('B', 2)],
    'D': [('B', 2)]
}

# Query function
def get_node_edges(node):
    return graph.get(node, [])  # Returns empty list if node doesn't exist

# Test it out
print(get_node_edges('B'))  # Output: [('A', 1), ('C', 2), ('D', 2)]
print(get_node_edges('C'))  # Output: [('B', 2)]
Option 2: Nested Dictionary

Use this if you also need to quickly check if a specific neighbor exists, or get its edge value without iterating:

graph = {
    'A': {'B': 1},
    'B': {'A': 1, 'C': 2, 'D': 2},
    'C': {'B': 2},
    'D': {'B': 2}
}

def get_node_edges(node):
    return list(graph.get(node, {}).items())  # Convert dict items to list of tuples

# Test
print(get_node_edges('B'))  # Output: [('A', 1), ('C', 2), ('D', 2)]

Why This Works So Well

  • Fast Queries: Hash table lookups are O(1) on average, so we instantly access the node's edge data.
  • Efficient Traversal: Once we have the adjacency list/dictionary, iterating through all edges takes O(k) time where k is the number of edges connected to the node—this is optimal, since we can't get all edges without looking at each one.
  • Easy Updates: Adding or removing an edge just requires updating both nodes' entries (since it's undirected), which is O(1) per update.

Note on Your Sample Output

Your example shows input B returning (C,2) and (D,2)—this likely omits the (A,1) edge for simplicity. The structure above will include all connected edges, but if you need to filter out specific nodes (like excluding the one you came from in a traversal), you can easily add a filter step in the query function.

内容的提问来源于stack exchange,提问作者Janothan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:44:28