2012-08-24 126 views
2

看起來他們都以同樣的方式做同樣的事情:懶惰的操作在一個特定的,但不一定是索引的順序,並且不一定回溯。鏈接列表和流之間的技術區別是什麼?

+0

只是爲了確認,你的意思股作爲http://en.wikipedia.org/wiki/Stream_(type_theory)? – leppie

+0

我腦子裏想的更像http://en.wikipedia.org/wiki/Stream_(computing),但您的鏈接似乎不兼容。 –

+0

正如你所說的'懶惰',我假定你嚴格懶惰流而不是數據/字節流。它是否正確? – leppie

回答

2

鏈接列表是一種表示內存中數據元素序列的特定方式,其中每個元素都與一個指向序列中下一個元素的指針配對。通過鏈接列表,您可以對其子序列執行一系列操作:可以剪切或插入整個元素鏈,或以非常低的成本從中間刪除元素。另一方面,數據流是按順序訪問數據的抽象概念,對數據在內存中的表示沒有任何特定的要求。您可以使用鏈表來實現流,但您也可以使用其他數據結構,例如普通數組或循環數組緩衝區。

+0

你是否也在考慮Stream類/類型? – leppie

+0

@leppie不,我正在考慮將流作爲「單向」只讀或只寫的抽象。 – dasblinkenlight

1

我認爲這有點像試圖比較蘋果和橘子。

鏈接列表是每個節點指向另一個節點的數據結構。它們是一個有用的結構,因爲插入和從鏈表中刪除項目只是重新指向一個節點,而不是一個需要分配更多洗牌的數組。有關更多信息,請參閱http://en.wikipedia.org/wiki/Linked_list

流是一個抽象對象,用於表示一系列字節。在大多數框架(Java,.NET等)中,有幾個用於從相關源(內存,文件等)讀取字節數組的流(存儲流,文件流等)的具體實現。

+0

流不是OP的上下文中的類或類型。 – leppie

+0

@leppie:是的,但這不是Neil的答案。他指出,通常抽象接口的具體實現稱爲「流」。另外,最初的問題並沒有提及它所設置的語言或環境的任何內容,所以我不確定你如何確定。 –

1

鏈接列表是一個數據結構,其中每個元素都有一個指向下一個元素的指針,並且可能在另一個方向上是相同的。圓形鏈表甚至有一個從最後一個到第一個元素的指針,反之亦然。那些指針(或者沒有指針的語言中的引用)定義了數據結構。他們暗示某種操作模式,但他們並不強制這樣做。例如,Java中的LinkedList類可以像數組一樣使用,但它不會很有效。它也可以用作(雙端)隊列或堆棧,具體取決於你調用的函數。

另一方面,流不是定義爲數據結構,而是定義爲元素的源或匯。如果您想到包裝流的文件流,套接字流或讀取器/寫入器類,則這些元素可以是字節或字符。流提供的元素也可能更復雜,例如,解析器的令牌。在這種情況下,流可能會在內部使用某種隊列,這可以使用鏈表或一些陣列構造來實現。

只要確保理解這兩個東西是在不同的抽象層上定義的。鏈表是根據內部工作原理定義的,而流是根據外部工作原理定義的。

0

在只讀單向鏈表和輸入流之間有一個共同的抽象,C++形式化爲InputIterator:您可以讀取一個值並且可以向前移動。在許多流API中,您必須同時執行這兩個API,但考慮到該API,很容易看出如何使用緩存一個值的包裝器將它們分開:C++將此類稱爲istream_iterator

然而,單鏈表有一個屬性,一個流並不總是有,其中C++正式確立爲ForwardIterator:您可以複製當前位置,移動副本前進,但仍處於該位置讀取數值的原始。廣義流不能做到這一點,因爲底層I/O只有一個「當前位置」。通過一個鏈表,你可以有多個指向列表中不同節點的指針,沒有問題。

一些流可以被標記和復位,回倒,seeked(尋求?)等,加入的設施,有點像一個C++ ForwardIterator,甚至RandomAccessIterator的。

我使用C++如不是因爲它的特別重要的一個例子,但由於迭代器的C++概念旨在部分地提供共同的抽象數據結構和流。並非所有語言都有這樣一個共同的抽象,但在Python另一個例子中,你可以寫for x in y:如果y是一個容器數據結構或者y是一個類似文件的對象,或一般如果y是「迭代」。

相關問題