在我的算法类中,我被告知用于图形表示的邻接列表的缺点是迭代通过对应于每个节点的相邻节点阵列的O(n)查找时间。我通过使用HashMap实现我的邻接列表,HashMap将节点映射到它们相邻节点的HashSet,不会只需要O(1)查找时间吗?我有什么遗失的吗?
答案 0 :(得分:5)
如您所知,使用HashMap中的键查找值为O(1)。但是,在邻接列表中,HashMap的值也是其相邻节点的列表。邻接列表的主要目的是迭代相邻节点。例如:图形遍历算法,如DFS和BFS。在你的情况下HashSet。假设HashSet中的元素数量为n。然后,即使在HashSet中迭代所有元素也是O(n)。
this.getDonation().then((val) => {//get Donation
this.donation = val;
if (this.donation.sponsordata == 1) {
this.detailInformationForm.controls['attendees'].validator = Validators.required;
}
let donationDates = this.donation.donationdates;
let dates = [];
_.forEach(donationDates, function (value, key) {
value.isChecked = false;
if (key == 0) {
value.isChecked = true;
}
dates.push(value);
});
this.donationDates = dates;
});
通常,邻接列表对于稀疏图是优选的,因为它是仅具有少量边的图。这意味着每个节点(HashMap的键)中相邻元素的数量较少。因此,查找元素不会花费更多。
答案 1 :(得分:3)
我通过使用HashMap实现我的邻接 list ,HashMap将节点映射到相邻节点的Hash Set ,不会只带O(1)查一下时间? [强调我的]
是的 - 但是" adjacency list"通常意味着表示为数组或链表而不是HashSet:换句话说,邻接列表被优化用于迭代顶点的邻居而不是查询两个顶点是否是邻居。
答案 2 :(得分:0)
可能产生比邻接表更省时的图形表示,尤其是对于顶点经常具有许多边的图形。
有了一个顶点映射,每个顶点包含一个相邻顶点和/或边对象的映射,我们可以通过索引一个顶点ID然后索引一个邻居来查看节点是否在O(1)时间内连接。与邻接表相比,这可能是一笔可观的节省,在邻接表中,我们可能必须遍历许多边缘才能找到特定的邻居。此外,面向对象的图数据结构可以使我们在边缘对象中存储任意数据...