Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 搜索无序列表而不将其转换为数组_Java_Search_List_Sorting - Fatal编程技术网

Java 搜索无序列表而不将其转换为数组

Java 搜索无序列表而不将其转换为数组,java,search,list,sorting,Java,Search,List,Sorting,是否有一种方法可以先排序,然后在对象链接列表中搜索对象。 我只是想给你一个排序方式和一个二进制搜索你觉得呢? 谢谢 java.util.Collectionssort java.util.CollectionsbinarySearch 这个类还有很多其他的神奇方法,可以让程序员的生活更轻松 请注意,sort方法的实现确实会将列表转换为数组,但在调用该方法之前,不需要显式地将列表转换为数组: java.util.Collectionssort java.util.Collectionsbinary

是否有一种方法可以先排序,然后在对象链接列表中搜索对象。 我只是想给你一个排序方式和一个二进制搜索你觉得呢? 谢谢

java.util.Collectionssort java.util.CollectionsbinarySearch 这个类还有很多其他的神奇方法,可以让程序员的生活更轻松

请注意,sort方法的实现确实会将列表转换为数组,但在调用该方法之前,不需要显式地将列表转换为数组:

java.util.Collectionssort java.util.CollectionsbinarySearch 这个类还有很多其他的神奇方法,可以让程序员的生活更轻松


请注意,排序方法的实现确实会将列表转换为数组,但从开始,您不需要在调用该方法之前显式地将列表转换为数组:

您可能想问,搜索排序列表是否是您用例的最佳选项,因为这样做的效果不好。列表排序为ONlogN,二进制搜索为OlogN。您可以考虑从列表元素中设置一个元素,然后通过包含方法(O1)来搜索它,如果您只想查看元素是否存在。如果你能解释更多关于你的用例的话,你可以更容易地给你一些建议。
<>编辑:考虑如果你打算为大列表做这件事。

你可能想问一下,在排序列表中搜索是否是你的用例最好的选择,因为这不是很好。列表排序为ONlogN,二进制搜索为OlogN。您可以考虑从列表元素中设置一个元素,然后通过包含方法(O1)来搜索它,如果您只想查看元素是否存在。如果你能解释更多关于你的用例的话,你可以更容易地给你一些建议。

编辑:考虑如果你打算为大列表做这个。

< P>这不是一个好方法,IMO.,如果你使用Copys.SoRtLead,其中列表是LinkedList,它将列表复制到一个临时数组中,对它排序,然后拷贝回列表,即OnLogn到排序加2×副本。但是,当您尝试执行二进制搜索(例如使用Collections.binarySearchlist)时,每次搜索都会执行列表遍历操作。因此,您可能还没有费心对列表进行排序

另一种方法是将列表转换为数组或ArrayList,然后对该数组/ArrayList进行排序和搜索。这将为设置提供一个副本加一个排序,并为每个搜索提供OlogN

但这两种方法都不是最好的方法。这取决于您需要执行搜索操作的次数

如果您只想在列表上进行一次搜索,那么调用list.contains。。。正在播放。。。这比任何涉及排序和二进制搜索的方法都要好

如果您想在一个永远不变的列表上执行多个搜索,那么最好将列表项放到哈希集中。构建哈希集已启用,搜索为O1。这假设您不需要自己的比较器

如果要在顺序不重要的情况下对不断更改的列表执行多个搜索,请使用哈希集替换该列表。更新哈希集的增量成本为每次添加/删除O1,每次搜索O1

如果要对一个不断变化的列表执行多个搜索,且搜索顺序非常重要,请使用插入顺序的LinkedHashMap替换该列表。每次添加/删除都是O1,每次搜索都是O1。。。但比例常数比哈希集大


我认为,这不是一个好方法。如果您使用Collections.sortlist,其中列表是一个LinkedList,这会将列表复制到一个临时数组中,对其进行排序,然后将其复制回列表“即ONlogN to sort+2*ON copies”。但是,当您尝试执行二进制搜索(例如使用Collections.binarySearchlist)时,每次搜索都会执行列表遍历操作。因此,您可能还没有费心对列表进行排序

另一种方法是将列表转换为数组或ArrayList,然后对该数组/ArrayList进行排序和搜索。这将为设置提供一个副本加一个排序,并为每个搜索提供OlogN

但这两种方法都不是最好的方法。这取决于您需要执行搜索操作的次数

如果您只想在列表上进行一次搜索,那么调用list.contains。。。正在播放。。。这比任何涉及排序和二进制搜索的方法都要好

如果您想在一个永远不变的列表上执行多个搜索,那么最好将列表项放到哈希集中。构建哈希集已启用,搜索为O1。这假设您不需要自己的比较器

如果要在顺序不重要的情况下对不断变化的列表执行多个搜索,请使用哈希替换该列表 更新哈希集的增量成本为每次添加/删除O1,每次搜索O1

如果要对一个不断变化的列表执行多个搜索,且搜索顺序非常重要,请使用插入顺序的LinkedHashMap替换该列表。每次添加/删除都是O1,每次搜索都是O1。。。但比例常数比哈希集大


二进制搜索不能很好地处理链表。你需要随机访问。根据API文档,对大型链表的binarySearch将与链接上的遍历进行OLOGN比较。一个简单的算法可以处理logn链接遍历。你这样做是为了构造一个计算机性能基准测试例程,并且你需要设置尽可能多的低效障碍来测试CPU的有效性能吗?另请参阅二进制搜索不能很好地处理链接列表。你需要随机访问。根据API文档,对大型链表的binarySearch将与链接上的遍历进行OLOGN比较。一个简单的算法可以在log n链路遍历上运行。您这样做是为了构造一个计算机性能基准例程,并且您需要设置尽可能多的低效障碍来测试CPU的有效性能吗?另请注意,这些方法将首先将整个列表转储到一个数组中,然后重新构建列表。所以这不是一个特定于链表的算法。@Thilo-这是正确的。它是有效的,但是如果您在链表上天真地这样做,那么性能将比简单地调用java.util.Listcontains差!!请注意,这些方法将首先将整个列表转储到一个数组中,然后重新构建列表。所以这不是一个特定于链表的算法。@Thilo-这是正确的。它是有效的,但是如果您在链表上天真地这样做,那么性能将比简单地调用java.util.Listcontains差!!请注意,java的排序方法使用了merge的修改版本sort@Suraj-那可能没关系。更重要的问题是理解您的用例并选择最合适的方法。最合适的方法和最不合适的方法之间的差异可能在**2。。。这是一个很大的区别!请注意,java的排序方法使用了merge的修改版本sort@Suraj-那可能没关系。更重要的问题是理解您的用例并选择最合适的方法。最合适的方法和最不合适的方法之间的差异可能在**2。。。这是一个很大的区别!