Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.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_Performance_Data Structures_Linked List - Fatal编程技术网

Java 处理链表中重复记录的最有效方法是什么?

Java 处理链表中重复记录的最有效方法是什么?,java,performance,data-structures,linked-list,Java,Performance,Data Structures,Linked List,我正在实现一个有序链表,我想知道在调用insert方法时,处理重复记录的最有效方法是什么。在操作之前搜索记录是否已经存在,还是评估该记录是否已经存在于操作中并引发异常更好 方法1 因为您询问的是效率,所以在insert实现中执行重复项检查总是更有效的。这就是为什么,假设您有一个包含N个元素的排序链表。您尝试插入的元素比列表中当前的任何元素都大。如果先搜索然后插入,则必须遍历N个元素以确认该元素不在列表中。然后再次遍历N个元素,以找到插入新元素的正确位置 我建议编写一个搜索方法,返回一个节点,该节

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

方法1


因为您询问的是效率,所以在insert实现中执行重复项检查总是更有效的。这就是为什么,假设您有一个包含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

希望这有帮助

在同一个迭代中检查显然更有效。如果效率是目标,为什么要使用链表?链表API通常允许重复条目。列表还对其性能做出了一些承诺。例如,在列表中插入一个值需要固定的时间,检查重复条目会将该时间增加到On。如果您必须保证条目是唯一的,您可能会考虑使用不同的数据结构,例如set。@Leffebrene感谢您的回答和建议,它对我很有用。实际上这是一项大学作业。也要感谢其他人。搜索一次总是比搜索两次更有效,你不这么认为吗?谢谢你的解释,伙计,现在对我来说更清楚了。一个建议是:不要搜索然后再遍历列表来插入元素,你可以在排序列表中一次搜索然后插入。例如[1,3,5,7,10],键是8。当您到达最后一个节点时,您知道10比给定的键(即8)大。因此,在元素10之前插入。@Naghaergowda这就是为什么我建议使用搜索方法,即使未找到元素,也返回列表中的位置进行插入。@Leffebrene这里您将遍历列表两次。一个是搜索要插入的位置,另一个是遍历以插入元素。为什么不能在一次遍历中同时执行这两个操作?@NaghaveerGowda不,我不是,我在insert方法内部调用search。搜索返回一个节点,我可以更新该节点以在其后面插入元素。
public void insert(int key){
    if(exists(key)){
        /* Throw an exception */
    }
    /* Code for insert element */
    /* ... */
    /* ... */       
}
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