看起來他們都以同樣的方式做同樣的事情:懶惰的操作在一個特定的,但不一定是索引的順序,並且不一定回溯。鏈接列表和流之間的技術區別是什麼?
回答
鏈接列表是一種表示內存中數據元素序列的特定方式,其中每個元素都與一個指向序列中下一個元素的指針配對。通過鏈接列表,您可以對其子序列執行一系列操作:可以剪切或插入整個元素鏈,或以非常低的成本從中間刪除元素。另一方面,數據流是按順序訪問數據的抽象概念,對數據在內存中的表示沒有任何特定的要求。您可以使用鏈表來實現流,但您也可以使用其他數據結構,例如普通數組或循環數組緩衝區。
你是否也在考慮Stream類/類型? – leppie
@leppie不,我正在考慮將流作爲「單向」只讀或只寫的抽象。 – dasblinkenlight
我認爲這有點像試圖比較蘋果和橘子。
鏈接列表是每個節點指向另一個節點的數據結構。它們是一個有用的結構,因爲插入和從鏈表中刪除項目只是重新指向一個節點,而不是一個需要分配更多洗牌的數組。有關更多信息,請參閱http://en.wikipedia.org/wiki/Linked_list。
流是一個抽象對象,用於表示一系列字節。在大多數框架(Java,.NET等)中,有幾個用於從相關源(內存,文件等)讀取字節數組的流(存儲流,文件流等)的具體實現。
流不是OP的上下文中的類或類型。 – leppie
@leppie:是的,但這不是Neil的答案。他指出,通常抽象接口的具體實現稱爲「流」。另外,最初的問題並沒有提及它所設置的語言或環境的任何內容,所以我不確定你如何確定。 –
鏈接列表是一個數據結構,其中每個元素都有一個指向下一個元素的指針,並且可能在另一個方向上是相同的。圓形鏈表甚至有一個從最後一個到第一個元素的指針,反之亦然。那些指針(或者沒有指針的語言中的引用)定義了數據結構。他們暗示某種操作模式,但他們並不強制這樣做。例如,Java中的LinkedList
類可以像數組一樣使用,但它不會很有效。它也可以用作(雙端)隊列或堆棧,具體取決於你調用的函數。
另一方面,流不是定義爲數據結構,而是定義爲元素的源或匯。如果您想到包裝流的文件流,套接字流或讀取器/寫入器類,則這些元素可以是字節或字符。流提供的元素也可能更復雜,例如,解析器的令牌。在這種情況下,流可能會在內部使用某種隊列,這可以使用鏈表或一些陣列構造來實現。
只要確保理解這兩個東西是在不同的抽象層上定義的。鏈表是根據內部工作原理定義的,而流是根據外部工作原理定義的。
在只讀單向鏈表和輸入流之間有一個共同的抽象,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
是「迭代」。
- 1. 標籤和文本框之間的(技術)區別是什麼?
- 2. 「const char *」和「const string」之間的EXACT技術區別是什麼?
- 3. CreateJS,JQuery和GreenSock之間的技術區別是什麼?
- 4. miracast和mirrorlink技術之間的區別?
- 5. WCAG 2.0:技術H44和技術F68之間的區別
- 6. 抽象類和接口之間的技術區別
- 7. 什麼是直接鏈接和鏈接的靜態libarary之間的區別
- 8. 流暢的界面和方法鏈之間有什麼區別?
- 9. 算術運算符^和。^之間的區別是什麼?
- 10. 靜態鏈接庫和動態鏈接庫之間的區別是什麼
- 11. 動態超鏈接列和超鏈接列之間的區別
- 12. 鏈接列表的首節點和起始節點之間有什麼區別?
- 13. $(())和expr之間的區別是什麼?
- 14. $和$ .fn之間的區別是什麼?
- 15. ++和:haskell之間的區別是什麼?
- 16. $(「」)和$ .find(「」)之間的區別是什麼?
- 17. 「\」和「\。」之間的區別是什麼?
- 18. 「$ | ++」和「$ | = 1」之間的區別是什麼
- 19. $(...)和`...`之間的區別是什麼
- 20. .equals()和==之間的區別是什麼?
- 21. [undefined]和[,]之間的區別是什麼?
- 22. 結構和列表ADT之間的用法區別是什麼?
- 23. 方法鏈接和流暢接口之間的區別
- 24. 流和管道之間的區別是什麼C
- 25. 軟件測試過程和技術之間的區別?
- 26. JLS,Java和相關技術之間的關係是什麼?
- 27. 向量和鏈接列表之間的區別ADT
- 28. 錨鏈接和window.location之間的區別?
- 29. 在Python中列表和列表[:]之間有什麼區別?
- 30. 編譯器和鏈接器之間有什麼區別?
只是爲了確認,你的意思股作爲http://en.wikipedia.org/wiki/Stream_(type_theory)? – leppie
我腦子裏想的更像http://en.wikipedia.org/wiki/Stream_(computing),但您的鏈接似乎不兼容。 –
正如你所說的'懶惰',我假定你嚴格懶惰流而不是數據/字節流。它是否正確? – leppie