【问题标题】:Multi-sorted data structure多排序数据结构
【发布时间】:2025-07-17 22:45:01
【问题描述】:

我正在尝试实现 A*,但遇到了问题。我有一个集合,我需要在其中找到给定函数的最小值,但我还需要能够检查给定单元格是否在该集合中。为了有效地做到这一点,我需要按位置和值对集合进行排序。编写这样的数据结构似乎并不太难。我只需要一个按位置排序,一个按值排序,并且每个都引用另一个。这有两个问题。首先,为了做得好,结构需要能够相互引用。如果我只能指向特定元素,那么在日志时间内搜索树是没有意义的。为了做到这一点,我几乎需要从头开始重写树。其次,这似乎不是我应该写的那种东西。数据结构应该是库的一部分。我需要的那种数据结构的名称是什么,在哪里可以找到它的 C# 库?

【问题讨论】:

    标签: c# sorting data-structures


    【解决方案1】:

    这两种数据结构根本不需要交互。只需并排有两个数据结构。确保在添加/删除项目时从两者中添加/删除它。然后,您可以根据您感兴趣的属性获取任一集合的最小值。

    创建新数据结构的唯一真正原因是确保添加/删除项目在两个集合之间保持同步。不需要显式地操作实际的树。

    这样的自定义类型看起来像这样(省略了其他操作;它们都只是委托给first 和/或second)。

    public class SetPair<T>
    {
        private SortedSet<T> first;
        private SortedSet<T> second;
    
        public SetPair(IComparer<T> firstComparer, IComparer<T> secondComparer)
        {
            first = new SortedSet<T>(firstComparer ?? Comparer<T>.Default);
            second = new SortedSet<T>(secondComparer ?? Comparer<T>.Default);
        }
    
        public T FirstMin { get { return first.Min; } }
        public T SecondMin { get { return second.Min; } }
    
        public bool Add(T item)
        {
            return first.Add(item) &&
                second.Add(item);
        }
    
        public bool Remove(T item)
        {
            return first.Remove(item) &&
                second.Remove(item);
        }
    }
    

    【讨论】:

    • 虽然没有优化。在集合中搜索一个值需要更长的时间,而不是仅仅从内存地址开始。
    • @DanielLC 如果您希望将最小值存储在变量中并在添加/删除项目时重新计算它,您也可以这样做。哪个更快取决于集合更改的频率相对于您获取最小值的频率。您还可以缓存最小值并在集合更改时使缓存无效。
    • @DanielLC 在这种情况下,尝试缓存值不会为您节省任何东西,您最好使用我提供的内容。