【问题标题】:Inserting into a linked list in alphabetical order efficiently有效地按字母顺序插入链表
【发布时间】:2019-09-23 02:14:15
【问题描述】:

我正在将我创建的类中的项目插入到链接列表中,但在添加之前我必须找到正确的索引点将它们插入(因此项目按字母顺序排列)。

我有一些工作代码,但效率低得离谱,在一台半体面的机器上花费 5 分钟来添加 10000 个项目。我想知道是否有更有效的方法来做到这一点。

到目前为止,我设法让它工作的唯一方法就是这样。任何其他方法最终都会错误地添加项目(我猜没有正确添加到列表的末尾)

在显示的代码中,我将一个名称(连同其他两个变量,它们不相关并且已经是 itemClass 的一部分)传递到以下代码中

if (llist.size() == 0) {
    llist.add(itemClass);
} 
else if (llist.get(0).name.compareTo(name)>0) {
    llist.add(0, itemClass);
} 
else if (llist.get(llist.size() - 1).name.compareTo(name) < 0) {
    llist.add(llist.size(), itemClass);
} 
else {
    int i = 0;
    while (llist.get(i).name.compareTo(name) < 0) {
        i++;
    }
    llist.add(i, itemClass);
}

目前,这完全符合预期,但如前所述,需要非常长的时间。我只是期待更快的东西,可能会有很大的差距。

【问题讨论】:

  • 重新考虑后,添加二分搜索可能会花费一半(?)时间;但我不知道如何实现这一点。想法?
  • 您是否特别需要使用 LinkedList ?
  • 是的,很遗憾。在这种情况下似乎违反直觉,但这是唯一的方法
  • 你不能使用 TreeSet 然后将其内容复制到 LinkedList 中吗?那会更快。

标签: java linked-list processing-efficiency


【解决方案1】:

你有一个链接列表,但你没有使用它的实际“链接”

删除对get的所有调用

您应该使用 listIterator,而不是调用 get

另外,你应该使用 listIterator 的 add 方法

【讨论】:

    猜你喜欢
    • 2019-01-25
    • 1970-01-01
    • 2013-09-17
    • 2012-10-21
    • 2021-08-10
    • 1970-01-01
    • 2019-06-12
    • 1970-01-01
    相关资源
    最近更新 更多