2012-08-24 2 views
2

둘 다 같은 방식으로 동일한 작업을 수행하는 것처럼 보입니다. 특정 작업이지만 반드시 필요하지는 않은 순서로 지연 작업을 수행하고 반드시 되돌릴 수는 없습니다.연결된 목록과 스트림의 기술적 차이점은 무엇입니까?

+0

그냥 확인하려면 http://en.wikipedia.org/wiki/Stream_(type_theory)의 스트림을 사용 하시겠습니까? – leppie

+0

마음에 더 http://en.wikipedia.org/wiki/Stream_(computing)와 비슷하지만 링크가 호환되는 것처럼 보입니다. –

+0

'게으른'라고 말했기 때문에, 나는 당신이 엄격하게 mea 게으른 스트림이 아닌 데이터/바이트 스트림이라고 가정합니다. 이 올바른지? – leppie

답변

2

링크 된 목록은 메모리의 데이터 요소 시퀀스를 나타내는 특정 방법으로, 각 요소는 시퀀스의 다음 요소에 대한 정렬 포인터와 쌍을 이룹니다. 링크 된 목록을 사용하면 하위 시퀀스에서 다양한 범위의 작업을 수행 할 수 있습니다. 매우 적은 비용으로 요소의 체인 전체를 잘라내거나 삽입하거나 중간에서 요소를 삭제할 수 있습니다.

스트림은 메모리에서의 표현에 대한 특정 요구 사항없이 순차적 순서로 데이터에 액세스하기위한 추상화입니다. 연결된 목록을 사용하여 스트림을 구현할 수 있지만 일반 배열이나 순환 배열 버퍼와 같은 다른 데이터 구조를 사용할 수도 있습니다.

+0

Stream 클래스/유형에 대해서도 생각하고 있습니까? – leppie

+0

@leppie 아니, 난 "편도"읽기 전용 또는 쓰기 전용 추상화로 스트림을 생각하고있어. – dasblinkenlight

1

나는 이것이 사과와 오렌지를 비교하려고하는 것 같다고 생각합니다.

연결된 목록은 각 노드가 다른 노드를 가리키는 데이터 구조입니다. 링크 된 목록에서 항목을 삽입하고 제거하는 것이 유용한 구조입니다. 배열을 사용하지 않고 노드를 다시 가리키는 것일뿐입니다. 자세한 내용은 http://en.wikipedia.org/wiki/Linked_list을 참조하십시오.

스트림은 일련의 바이트를 나타내는 데 사용되는 추상화 된 객체입니다. 대부분의 프레임 워크 (Java, .NET 등)에는 관련 소스 (메모리, 파일 등)에서 바이트 배열을 읽는 데 사용되는 Steams (메모리 스트림, 파일 스트림 등)의 몇 가지 구체적인 구현이 있습니다.

+0

스트림이 OP의 컨텍스트에서 클래스 또는 유형이 아닙니다. – leppie

+0

@leppie : 네,하지만 그건 닐의 대답이 주장한 것이 아닙니다. 그는 "스트림"이라고하는 추상 인터페이스의 구체적인 구현이 보통 있다고 지적했습니다. 또한 원래의 질문에는 어떤 언어 나 환경이 설정되어 있는지에 대해서는 언급되어 있지 않으므로 어떻게 확신 할 수 있는지 실제로 알 수는 없습니다. –

1

링크 된 목록은 각 요소가 다음 요소를 가리키는 포인터를 가지며 가능하게는 다른 방향을 가리키는 데이터 구조입니다. 순환 링크 된 목록에는 마지막 요소부터 첫 번째 요소까지의 포인터가 있고 그 반대도 마찬가지입니다. 이러한 포인터 (또는 포인터가없는 언어의 참조)는 데이터 구조를 정의합니다. 그것들은 특정한 작동 방식을 암시하지만, 강제하지는 않습니다. 예를 들어 Java의 LinkedList 클래스는 배열처럼 사용할 수 있지만 그다지 효과적이지는 않습니다. 또한 호출하는 함수에 따라 (양 끝점) 대기열 또는 스택으로 사용할 수 있습니다.

스트림은 데이터 구조가 아니라 요소의 소스 또는 싱크로 정의됩니다. 파일 스트림, 소켓 스트림 또는 스트림을 래핑하는 판독기/기록기 클래스를 생각하면 이러한 요소는 바이트 또는 문자가 될 수 있습니다. 스트림에 의해 제공되는 요소는 더 복잡 할 수도 있습니다. 파서 용 토큰. 이 경우 스트림은 연결 목록 또는 일부 배열 구성을 사용하여 구현 될 수있는 일종의 대기열을 내부적으로 사용합니다.

이 두 가지가 서로 다른 추상화 레이어에 정의되어 있는지 확인하십시오. 연결된 목록은 내부적으로 작동하는 방법에 대해 정의되며 스트림은 외부에서 작동하는 방식에 대해 정의됩니다.

0

읽기 전용 단일 링크 목록과 입력 스트림 사이에는 공통적 인 추상화가 있습니다. C++은이 형식을 InputIterator으로 형식화합니다. 값을 읽고 앞으로 이동할 수 있습니다. 많은 스트림 API에서 두 가지를 동시에 수행해야하지만 API를 사용하면 하나의 값을 캐시하는 래퍼를 사용하여 API를 분리하는 방법을 쉽게 알 수 있습니다. C++에서는이 클래스를 istream_iterator이라고합니다. 그러나

, 싱글 링크드리스트는 ForwardIterator로 공식화 C++ 스트림은 항상없는 속성이 있습니다 : 당신이 현재 위치를 복사 앞으로 사본 이동 만, 여전히 위치에서 값을 읽을 수 있습니다 원래의 기본 I/O에는 하나의 "현재 위치"만 있기 때문에 일반화 된 스트림에서는이 작업을 수행 할 수 없습니다.연결된 목록을 사용하면 문제없이 목록의 다른 노드에 여러 개의 포인터를 가질 수 있습니다.

일부 스트림은 C++ ForwardIterator 또는 RandomAccessIterator와 비슷한 기능을 추가하고 다시 표시, 되감기, 탐색 (검색) 할 수 있습니다.

저는 C++을 예로 들었습니다. 특히 중요하기 때문에가 아니라 반복자의 C++ 개념은 부분적으로 데이터 구조와 스트림에 공통적 인 추상화를 제공하기 위해 설계 되었기 때문입니다. 모든 언어가 그런 공통적 인 추상화를 가지고있는 것은 아니지만, 파이썬의 또 다른 예에서는 이 컨테이너 데이터 구조이거나 y이 파일과 유사한 객체이거나 일반적으로 y이 "iterable"인 경우 for x in y:을 쓸 수 있습니다.

관련 문제