我正在处理一个非常大的(自定义对象)链表,我正在尝试确定我正在尝试添加到列表中的对象是否已经存在。
问题是我搜索的项目是一个唯一的对象,包含: 第一个字符串 第二个字符串 一个独特的Count#
我试图找出我的链表中是否有一个项目包含(第一个字符串)和(第二个字符串),但忽略(唯一的Count#)。
这可以通过浏览每个单独的链表项来以愚蠢的方式(我首先尝试它的方式)完成 - 但这需要太长时间。我正在努力加快速度!我认为使用(indexOf)会有所帮助,但我不知道如何自定义搜索内容。
有什么想法吗?
答案 0 :(得分:2)
indexOf()也具有O(n)性能,因为它会逐步扫描List,直到找到您要查找的元素。
列表是否排序?如果是这样,您可以使用类似quicksort的东西搜索元素。
如果您需要对随机元素进行持续时间访问,我认为链接列表不是您最好的选择。
答案 1 :(得分:2)
您是否需要使用LinkedList?如果它不是遗留代码,我建议HashSet
或LinkedHashMap
。两者都会为您提供恒定时间查找,如果您仍需要插入顺序迭代,LinkedHashMap
会有一个内部LinkedList
贯穿密钥。
答案 2 :(得分:1)
不幸的是,“愚蠢的方式”是最有效的方式,尽管你可以使用
if ( linkedList.contains(objectThatMayBeInList) ) { //do something }
问题是LinkedList具有O(N)的最佳案例搜索,其中N是列表的大小。这意味着在任何给定的搜索中,您都有N次计算的最坏情况。链接列表不是这种操作的最佳数据结构,但与此同时,它并不是那么糟糕,并且它不应该太慢,计算机擅长这样做。您是否可以根据列表的大小向我们提供更具体的内容?
答案 3 :(得分:1)
基本上你想知道对象A是否存在于链表L中。这是搜索问题,如果列表是无序的,你不能比O(n)更快。
如果您对列表进行排序(使插入速度变慢),您可以进行二进制搜索以查看列表中是否有A,这会更快。
除了列表之外,您还可以保留Map(例如HashMap或TreeMap),您可以在其中跟踪列表中的内容。