추상 데이터 유형 및 데이터 구조


32

이러한 용어를 이해하기가 매우 어렵습니다. Google에서 검색하여 Wikipedia에서 조금 읽었지만 여전히 확실하지 않습니다. 나는 지금까지 다음을 결정했습니다.

추상 데이터 형식 은 새로운 형식의 정의이며 해당 속성과 작업을 설명합니다.

데이터 구조 는 ADT의 구현입니다. 많은 ADT를 동일한 데이터 구조로 구현할 수 있습니다.

내가 올바르게 생각하면 ADT로서의 배열은 요소의 컬렉션을 의미하고 데이터 구조로서 메모리에 저장되는 방법을 의미합니다. 스택은 푸시, 팝 연산이있는 ADT이지만 스택에서 구현 된 스택을 알고리즘에서 사용했다면 스택 데이터 구조에 대해 말할 수 있습니까? 왜 힙이 ADT가 아닌가? 트리 또는 배열로 구현할 수 있습니다.




답변:


24

간단히 말해, ADT (Abstract Data Type)는 논리적 설명에 가깝고 데이터 구조는 구체적입니다.

ADT를 데이터의 그림과 데이터를 조작하고 변경하는 작업으로 생각하십시오.

데이터 구조는 실제적이고 구체적인 것 입니다. 알고리즘 내에서 구현 및 사용할 수 있습니다.


그러나 알고리즘 내에서 스택 및 큐 (ADT 인)도 구현할 수 있습니다. 아니?
FedericoCapaldo

스택 및 큐는 특정 컴퓨터 과학 의미를 가진 논리적 표현입니다. 그러나 C #, Java, Go 또는 [name your language]에서 큐 구현은 약간 다릅니다. 대기열 개념은 ADT, Java 대기열은 데이터 구조입니다. C # 스택 구현과 동일합니다.
베린 로리 치

53

ADT는 데이터 구조가 클래스 (무엇을 하는가) 에 대한 인터페이스 ( 무엇을 하는가 )에 대한 것이다 .

몇 가지 예 :

ADT: List
DS:  ArrayList, LinkedList...

ADT: Map
DS:  HashMap, TreeMap...

당신이 요점을 알 것 같아요.


ADT는 일반적인 유형의 데이터 구조라고 할 수 있습니다.
Owais Qureshi

1
답변이 표시되어야합니다. 평신도에게는 더 간단하다고 말할 수 없었습니다.
deppfx

간단하고 효과적인 답변을 위해 @dagnelies에게 감사드립니다. 답변으로 표시해야합니다.
Sarun UK

1
왜 그런지 잘 모르겠지만 여기에 문구를 약간 재정렬하는 것을 선호합니다 ADT is to a Data Structure, what an Interface (what it does) is to a Class (how it does it). 그 예가 제자리에 있습니다.
Aditya MP

10

추상 데이터 유형 : ADT는 특정 구현과 관계없이 정확하게 지정된 일련의 데이터 값 및 관련 작업으로 정의 될 수 있습니다. 따라서 추상 데이터 유형은 정보를 체계적으로 수집하고 해당 정보를 관리하는 데 사용되는 일련의 작업입니다. 일련의 작업은 ADT의 인터페이스를 정의합니다. ADT가 인터페이스의 조건을 충족하는 한 실제로 ADT가 어떻게 구현되는지는 중요하지 않습니다. ADT에서 데이터 값과 연산은 컴퓨터 언어로 구현되는 것이 아니라 수학적으로 정밀하게 정의되므로 연산의 영향, 프로그램이 데이터 유형을 구현하는지 여부에 따라 다른 추상 데이터 유형과의 관계에 대해 추론 할 수 있습니다.

추상 데이터 유형 (ADT)과 콘크리트 데이터 유형의 기본적인 차이점은 후자가 콘크리트 표현을 볼 수있는 반면, 전자는 표현을 숨길 수 있다는 것입니다. ADT는 순수한 ADT 또는 업데이트 가능한 ADT 일 수있다. 순수한 ADT는 모든 작업이 순수한 기능인 것입니다. 이는 작업에 부작용이 없음을 의미합니다. 특히 입력 인수를 수정하거나 업데이트하지 않습니다. ADT (또는 다른 유형)의 새로운 값인 출력을 생성하기 위해 이러한 인수를 사용합니다. 대부분의 콘크리트 유형은 순수합니다. 예를 들어, 정수에 대한 조작은 실제로 정수를 수정하지 않습니다. 대신 '+'와 같은 모든 작업은 새로운 출력을 생성합니다.

업데이트 가능한 ADT는 일부 작업이 실제로 ADT의 값을 변경하는 것입니다. 예를 들어 스택을 인수로 받아서 수정 한 'pop'이라는 작업이 있다고 가정합니다. 우선 순위가 가장 높은 항목을 제거하여 ( "제자리에", "파괴적으로") 이 작업은 불완전한 것으로 간주되며 전체 ADT도 불완전합니다. ADT는 사용자 정의 ADT 일 수있다.

Abstract Data Type은 다음 두 가지 조건을 만족하는 데이터 유형이라는 것을 알고 있습니다.

  1. 유형과 연산의 표현 또는 정의는 단일 구문 단위에 포함됩니다.

  2. 형식의 개체 표현은 형식을 사용하는 프로그램 단위에서 숨겨 지므로 해당 개체에 대해 가능한 직접 작업 만 형식 정의에 제공됩니다.

사용자 정의 추상 데이터 유형은 다음을 제공해야합니다.

  1. 프로그램 단위가 유형의 변수를 선언 할 수 있지만 이러한 변수의 표현을 숨기는 유형 정의.

  2. 유형의 객체를 조작하기위한 일련의 작업입니다.

사용자 정의 추상 데이터 유형의 예는 구조입니다. 'C'는 int, char, float 및 double의 네 가지 기본 유형을 제공합니다. 그러나 'C'는 프로그래머에게 자신의 유형을 정의 할 수있는 기능도 제공합니다. 구조는 그러한 예 중 하나입니다. 구조는 각 파트가 기존 유형 인 여러 파트의 집합입니다.

struct abc

{int x;

float y;

};

위의 구조 정의는 변수를 만들지 않고 새로운 유형을 만듭니다. 이 유형의 변수는 내장 유형의 변수와 유사한 방식으로 작성 될 수 있습니다.

struct abc a;

typedef 키워드를 사용하면 새로운 유형에 대한 새로운 유형 이름을 만들 수 있습니다.

예를 들면 다음과 같습니다.

typedef struct abc AB;

여기서 AB는 새 유형을 작성하는 데 사용할 수있는 새로운 유형 이름입니다.

AB b;

데이터 구조 : 다음은 데이터 구조의 특징입니다.

  1. 여기에는 원자 또는 다른 데이터 구조 (여전히 도메인)가 될 수있는 구성 요소 데이터 항목이 포함됩니다.

  2. 하나 이상의 구성 요소 항목에 대한 일련의 작업.

  3. 구성 요소가 서로 연관되는 방식 및 전체 구조 (어설 션)에 대한 규칙을 정의합니다.

데이터 구조 :

데이터 구조는 정적이거나 동적 일 수 있습니다. 정적 데이터 구조는 크기가 고정되어 있습니다. 이 의미는 정적 수정 자의 의미와 다릅니다. 배열은 정적입니다. 보유 할 수있는 요소 수를 정의한 후에는 숫자가 변경되지 않습니다. 동적 데이터 구조는 내용에 따라 실행 시간에 늘어나거나 줄어 듭니다. 동적 데이터 구조는 링크를 사용하여 구현됩니다.

데이터 구조는 또한 선형 데이터 구조 및 비선형 데이터 구조로 분류 될 수있다. 선형 데이터 구조에서 모든 구성 요소는 첫 번째 요소와 마지막 요소를 제외하고 고유 한 선행 작업 및 후속 작업을 갖지만, 비선형 데이터 구조의 경우 요소가 우리가 사용하는 방식에 의해 제한되는 원하는 방식으로 배열 될 수 있으므로 그러한 제한이 없습니다. 그러한 유형을 나타냅니다.


0

우선, 데이터 구조의 용어는 매우 혼란 스러울 수 있습니다.

ADT 는 데이터 구조의 작동 방식, 지원해야하는 작업 종류 등을 알려주는 이론 또는 모델 또는 지침 과 같습니다. 컨테이너, 사전 및 우선 순위 대기열의 세 가지 기본 추상 데이터 유형입니다. 예를 들어 사전,이 사전 ADT를 구현하는 모든 데이터 구조는 키-값 쌍, 키 기반 검색, 항목 삽입, 주어진 키의 후속 작업 및 선행 작업 등을 지원해야 함을 알려줍니다.

이제 ADT 위에서 이것을 구현하는 다른 모든 것은 데이터 구조 (DS) 이며, 데이터 구조는 문제에서 구현하고 라이브러리 내부에서 찾을 수있는 실제 것입니다. 사전의 경우 배열 또는 링크 된 목록을 통해 구현하도록 선택할 수 있습니다.

누군가 DS를 ADT로 이름을 지정할 때 실제 혼란 이 발생 한다고 생각 합니다. 예를 들어 어떤 사람들은 완벽하게 합법적 인 DictImplementation 대신 앞서 언급 한 DS를 'Dictionary'라고 부릅니다.

Ref : Skiena : 알고리즘 디자인 매뉴얼

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.