【问题标题】:What is the most efficient way to handle a duplicate record in a linked list?处理链表中重复记录的最有效方法是什么?
【发布时间】:2019-07-01 22:32:00
【问题描述】:

我正在实现一个有序链表,我想知道在调用 insert 方法时处理重复记录的最有效方法是什么。是在操作之前搜索记录是否已经存在,还是在操作中评估记录是否已经存在并抛出异常更好?

方法#1

public void insert(int key){
    if(isEmpty())
        head = new Node(key);
    else if(key < head.data){
        /* Code to verify if they are equal */
        /* ... */
        /* ... */
        Node new_node = new Node(key);
        new_node.next = head;
        head = new_node;
    }else{
        Node tmp = head;
        while((head.nex != null) && (key > tmp.key)){
            /* Code to verify if they are equal */
            /* ... */
            /* ... */
            tmp = tmp.next;
        }
        /* Create node and change "pointers"*/
        /* ... */
        /* ... */
    }               
}

方法#2

public void insert(int key){
    if(exists(key)){
        /* Throw an exception */
    }
    /* Code for insert element */
    /* ... */
    /* ... */       
}

【问题讨论】:

  • 在同一迭代中检查显然更有效。
  • 如果效率是目标,为什么要使用链表?
  • 链表 API 通常允许重复条目。列表还对其性能做出了一些承诺。例如,向列表中插入一个值应该花费恒定时间,检查重复条目会将其增加到 O(n)。如果您必须保证条目是唯一的,您可能会考虑使用不同的数据结构,例如 set。
  • @LeffeBrune 感谢您的回复和建议,这对我很有用。其实这是大学作业。也感谢其他人。
  • 搜索一次总比搜索两次更有效,你不觉得吗?

标签: java performance data-structures linked-list


【解决方案1】:

由于您询问效率,因此在“插入”实现中执行重复检查总是会更有效。这就是为什么,假设您有一个包含 N 个元素的排序链表。您尝试插入的元素大于列表中当前的任何元素。如果您先搜索然后插入,则必须遍历 N 个元素以确认该元素不在列表中。然后,您将再次遍历 N 个元素以找到插入新元素的正确位置。

我建议编写一个“搜索”方法,该方法返回一个最大键小于或等于您正在搜索的键的节点。例如,给定一个列表{ 1, 2, 5, 7, 10 } 和一个搜索键6,您的搜索方法应该返回节点5。您现在可以在 insert 方法中调用 search ,如果它会返回一个带有您搜索的键的节点,或者一个最大键仍然小于您的搜索键的节点,之后您可以使用搜索插入一个新节点核心价值。像这样的:

insert(k)
  Node n = search(k) // what should search return if the list is empty?
  if (n.data < k)
     // insert new node after "n"
  else
     // handle existing key

希望这会有所帮助!

【讨论】:

  • 感谢老兄的解释,现在我更清楚了。
  • 一个建议:与其搜索然后再次遍历列表以插入元素,不如在排序列表中一次搜索并插入。例如 [1, 3, 5, 7, 10] 和 key 是 8。当你到达最后一个节点时,你知道 10 比给定的 key 大,即 8。所以在元素 10 之前插入。
  • @LeffeBrune 在这里您将遍历列表两次。一,您正在搜索要插入的位置和另一个遍历以插入元素。为什么不能一次遍历两者?
  • @NaghaveerGowda 不,我不是,我在插入方法中调用搜索。 “搜索”返回一个节点,我可以更新它以在其后插入元素。
猜你喜欢
  • 1970-01-01
  • 2020-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 2021-12-21
相关资源
最近更新 更多