簡體   English   中英

java LinkedList與自己的實現

[英]java LinkedList vs own implementation

我從一個矩形開始,由此我需要能夠調整形狀。 (用於裝箱 )。

為此,我想使用雙向鏈表,因為描述算法的文章也使用了雙向鏈表。

例如,這將允許我從一個正方形轉到另一個: 在此處輸入圖片說明

從給定的向量中,我還需要能夠識別出北和東的點: 在此處輸入圖片說明

我想知道的是, LinkedList的Java實現對此有好處嗎? 我懷疑是因為:

  1. 沒有wikipedia解釋那樣的insertBefore和insertAfter方法,並且這些方法似乎已用完。

  2. 無法從某個點開始遍歷。 這看起來相當繁重,因為如果我想從給定向量的邊緣向上找到點,我必須從頭開始迭代嗎?

我還有更多疑問,但我很難解釋。 如果我很容易解釋,那么我可能不會一開始就問。

在大多數情況下,LinkedList對於列表實現是最糟糕的選擇,因為它確實很慢。 您最可能想使用由數組支持的ArrayList( http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html )。

這要快得多。

要點1.您可以使用

list.add(int index, E element);

在給定索引之前/之后插入。 要在元素之前/之后插入,請使用

list.indexOf(Object o)

獲取該元素的索引。

要點2。這特定於鏈接列表。 由於數組列表由數組支持,因此您可以“無時間”開始遍歷。

list.get(int index)

另請參閱: 何時在ArrayList上使用LinkedList?

您的問題有很多要點,我將盡力解決所有問題:

清單執行

Java實際上有許多List接口的實現。 為您的用例選擇正確的實現很重要。 一些列表實現。 一些List實現還實現了DequeQueueRandomAccess類的接口,並提供了額外的有用方法。

如果列表的預期長度很大,則為您的使用模式選擇具有正確性能特征的實現也很重要。 一些實現方案更擅長處理隨機讀取,隨機插入等問題。如果列表很小,則可能不會注意到任何性能差異。

最常見的實現是:

數組列表

列表中的所有元素都放在一個支持數組中。 很好,因為它提供了對元素的真正快速的隨機讀取訪問。 復雜度ArrayList::get(index)為O(1)(不取決於列表的大小)。 雙向迭代也很快。

但是, ArrayList隨機插入/刪除性能非常差。 在列表末尾添加或刪除元素是一種快速的O(1)操作,但是在列表中其他任何地方插入或刪除元素的O(n)則要慢得多,因為數組中所有元素都必須在插入點之后放置向右/向左移動。 ArrayList最壞的情況是修改列表的開頭。

在使用Iterator進行迭代時一一刪除元素是非常糟糕的:O(m * n)其中n是列表的長度,m是要刪除的元素數。

鏈表

Java LinkedList實際上是一個雙鏈表。 它具有較差的隨機訪問性能O(n),但迭代速度很快。 在列表的開頭或結尾添加或刪除項目的速度非常快O(1),但是在列表中間的任意位置添加元素的速度為O(n),因為實現必須首先遵循所有鏈接到在插入之前找到插入點。 如果要在較小的隨機范圍內插入許多元素,則可以在sublist()上獲得很多性能,因此需要遵循的鏈接數減少到子列表的大小。

使用Iterator進行迭代時一一刪除元素是o(m),其中m是要刪除的元素數(請注意,列表的長度不是一個因素。

insertBefore,insertAfter

您鏈接的Wikipedia頁面上描述的這些操作實際上是任何鏈接列表內部的操作,通常不屬於列表的公共API的一部分。 如您所見,這些操作是使用Node實例描述的, Node實例是典型鏈接列表的內部實現細節。

在Java中,你可以使用的各種口味add()addAll()並結合它indexOf()sublist()來達到同樣的效果和性能特點。

從任意點迭代

在這兩種情況下,從代碼角度來看,從任意角度開始在列表上進行迭代都是微不足道的。 您可以使用listIterator()方法來獲取可以從特定點向任意方向進行迭代的迭代器。

您還可以使用sublist(start, end)方法,該方法返回一個新的List實例,該實例是基礎列表上的視圖(即:如果您修改了subList()返回的列表,則實際上是在修改原始列表)。 因此,要遍歷元素2-5,只需執行myList.sublist(2, 6).forEach(el -> doSomething(el))

僅僅因為您將對象存儲在一個結構中並不會阻止您維護也包含對象的其他結構。

對於前后移動,我可能會使用ArrayList,因為它實現了RandomAccess

為了搜索與水平/垂直線相交的線段,我可能會使用兩個IntervalTree

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM