我正在尝试在A*算法中实现一个缓存路径列表。目前,缓存的路径被存储在一个类似于这样的列表中:
readonly List<CachedPath> _cachedPaths = new List<CachedPath>();
这个列表可以执行以下操作:
使用FirstOrDefault获取满足特定条件的元素
var cached = _cachedPaths.FirstOrDefault(p => p.From == from && p.To == target && p.Actor == self);
删除一个元素
_cachedPaths.Remove(cached);
新增内容
_cachedPaths.Add(new CachedPath {
From = from,
To = target,
Actor = self,
Result = pb,
Tick = _world.WorldTick
});
注意:CachedPath类仅使用From,To和Actor重写了GetHashCode和Equals方法,因此具有这些相同属性的两个实例具有相同的哈希和相等性。
鉴于在“HashSet”中进行快速查找(Contains),插入和删除均为O(1)(如果我没有弄错的话),我考虑使用“HashSet”来执行这些操作。唯一的问题是FirstOrDefault,我不得不枚举整个集合来获取它。
考虑到这个问题,我还考虑使用由From,To和Actor的哈希索引的Dictionary:
Dictionary<int, CachedPath> cachedPath
再次强调,如果我没有理解错误的话,字典(Dictionary)在插入、删除和按键检索方面也提供了O(1)的性能。这让我认为字典是一个哈希集合(HashSet)加上O(1)元素检索功能。
我有遗漏什么吗?字典真的比哈希集合更好,因为它支持更多的操作吗?
提前感谢。