【发布时间】:2011-03-16 10:10:48
【问题描述】:
我正在查看 List,我看到一个带有一些重载的 BinarySearch 方法,我不禁想知道在 List 中使用这样的方法是否有意义?
除非列表已排序,否则我为什么要进行二进制搜索?如果列表没有排序,调用该方法只会浪费 CPU 时间。在 List 上使用该方法有什么意义?
【问题讨论】:
-
其实这是个好问题。但是任何类型系统(不仅仅是 C#/.NET)是否有可能允许一种方法仅适用于“排序”项目?您如何知道项目是否在类型系统上排序?
-
除非列表已排序,否则我为什么要进行二分搜索? -- 您已经回答了自己的问题……您希望进行二分搜索如果您的列表已排序。 如果列表未排序,则调用该方法只会浪费 CPU 时间——因此,如果您的列表未排序,请不要调用它。仅仅因为存在一种方法,并不强迫您使用它,尤其是在不满足先决条件时。
-
@SedatKapanoglu 当然 ...编写一个 MaybeSortedList
类,该类维护一个标志,说明集合是否已排序。如果设置了该标志,则 Add 使用二进制搜索查找插入点,Find 使用二进制搜索查找项目,而 Remove 使用二进制搜索删除项目。如果未设置标志,请在末尾添加并回退到查找和删除的线性搜索。设置标志时的 InsertAt 操作检查项目是否按顺序插入,如果没有则清除标志。但即使有这样一个类,对列表和数组的“不安全”独立二进制搜索方法也是有用的。 -
@SedatKapanoglu 如果您将乱序插入到先前排序的列表中,插入操作只会很慢......所以不要这样做。您应该维护一个已排序或未排序的列表,而不是将它们混合在一起,即使抽象允许它。而且我认为不需要使用 Sort 的新方法……只需使用 OrderBy 和 ThenBy。
-
@SedatKapanoglu我只回答了您关于如何知道项目是否按类型安全排序的问题。我实际上并不推荐 MaybeSortedList
...相反,有 List 和 SortedList (但不是 .NET 的可恶的错误命名的 SortedList 实际上是 IDictionary )两者其中实现 IList ,并使用其中一个。
标签: c# list collections binary-search