2009-06-22 7 views
7

링크와 같은 데이터 구조는 실제 프로그래밍을 위해 완전히 학문적 인 것이거나 실제로 사용합니까? 당신이 그들을 만들 필요가 없도록 제네릭에 의해 보호되는 것들입니까? (귀하의 언어는 generics가 있다고 가정) 나는 그들이 무엇인지 이해하는 것의 중요성, 학계 밖에서의 그것들의 사용법을 논하는 것이 아닙니다. 프론트 엔드 웹에서 백엔드 데이터베이스 관점을 묻습니다. 나는 누군가 어딘가에 이들을 만들 것이라고 확신한다. 나는 내 맥락에서 묻고있다.비즈니스 프로그래밍에서 연결된 목록, 이중 연결된 목록 등을 사용합니까?

감사합니다.

편집 : 제네릭을 사용하면 링크 된 목록 등을 만들 필요가 없습니까?

답변

4

사용하는 언어 및 프레임 워크에 따라 다릅니다. 대부분의 현대 언어와 프레임 워크는 이러한 바퀴를 다시 만들지 않습니다. 대신 그들은 List<T> 또는 HashTable과 같은 것을 제공 할 것입니다.

편집 :

우리는 아마 목록을 항상 연결 사용하지만, 그것을 실현하지 않습니다. 우리가 사용하는 프레임 워크는 이미 우리를 위해 작성했기 때문에 링크 된 목록의 구현을 자체적으로 작성할 필요가 없습니다.

"제네릭"에 대해 혼란 스러울 수도 있습니다. List<T>과 같은 일반적인 목록 클래스를 참조 할 수 있습니다. 이것은 비 제네릭 클래스 List와 동일하지만 요소는 항상 T 유형입니다. 아마 연결된 목록으로 구현되었지만 우리는 그것에 대해 신경 쓸 필요가 없습니다.

우리는 물리적 메모리의 할당이나 인터럽트의 작동 방식이나 파일 시스템을 만드는 방법에 대해 걱정할 필요가 없습니다. 우리에게는이를 위해 운영 체제가 있습니다. 그러나 우리는 학교에서 그 정보를 똑같이 배울 수 있습니다.

+2

목록 은 배열로 구현됩니다. 필요에 따라 동적으로 크기를 조정합니다 (매번 길이가 두 배로 늘어남). – DancesWithBamboo

+0

목록 은 아마도 연결 목록으로 구현되지 않습니다. 첫 페이지 (http://msdn.microsoft.com/en-us/library/6sh2ey19.aspx)에서 말하듯이, 이것은 확실히 배열로 구현됩니다. 또한 데이터 구조에 대해 걱정할 필요가 없지만 다른 비즈니스 프로그래머는 걱정하지 않아도됩니다. 그리고 ... 어쩌면 당신도 그렇게해야합니다. –

+0

네, 솔직히 말하면, 아마 그것에 대해 신경 써야합니다. – mquander

3

확실히. 현대 언어의 많은 "목록"구현은 실제로 링크 된 목록입니다. 직접 액세스 할 수있는 배열 또는 해시 테이블과 결합되어 있습니다 (반복과 달리 인덱스로).

연결된 목록 (특히 이중 연결 목록)은 "실제"데이터 구조에서 매우 일반적으로 사용됩니다.

모든 공용 언어에는 언어 기본, 기본 템플릿 라이브러리 (예 : C++), 기본 라이브러리 (예 : Java) 또는 일부 제 3 자 구현 (아마도 열려있는 것)과 같이 링크 된 목록의 미리 빌드 된 구현이 있다고 말할 수 있습니다. -출처).

과거에는 여러 번 복잡한 데이터 구조의 인프라 코드를 만들 때 링크 된 목록 구현을 직접 작성했습니다. 때로는 구현을 완전히 제어하는 ​​것이 좋습니다. 때로는 특정 요구 사항을 충족시키기 위해 고전적인 구현에 "비틀기"를 추가해야 할 때도 있습니다. 선택 사항과 절충 사항을 이해하는 한 자신의 구현을 코드화할지 여부는 옳지 않다. 대부분의 경우와 C#과 같은 매우 현대적인 언어에서는 확실히 피할 수 있습니다.

배열/벡터 또는 해시 테이블과 목록을 사용해야하는 또 다른 경우가 있습니다. 귀하의 질문에 나는 당신이 여기에 상충 관계에 대해 알고 있으므로 너무 많이 사용하지는 않을 것이지만, 기본적으로 주 용도가 목록을 순차적으로 통과하고 목록 크기가 크게 다를 수있는 경우 목록을 실행 가능한 옵션이 될 수 있습니다. 또 다른 고려 사항은 삽입 유형입니다. 일반적인 사용 사례가 "중간에 삽입"되는 경우 목록이 배열/벡터보다 중요한 이점을 갖습니다.계속할 수 있지만이 정보는 고전적인 CS 서적에 있습니다.

설명 : 내 답변은 언어에 구애받지 않으며 제네릭에 특히 관련이 없으며 제 이해에는 연결 목록 구현이 있습니다.

+0

혼란스러워. "목록"구현 (제 생각에는 제네릭)이 일반적으로 사용되는 연결 목록이라고 말하고 있습니까? 또는 일반적으로 구축해야하는 다른 것이 링크 목록에 있습니까? 귀하의 의견에 감사드립니다. – johnny

+0

일부 언어에서 가장 기본적인 목록 구조는 실제로 링크 된 목록입니다 (C 파생어에서는 일반적으로 배열이고 크기 조정이 가능한 목록의 벡터 임에도 불구하고). 언어가 기본이 아닌 경우 일반적으로 링크 된 표준 라이브러리 (예 : .NET, Java)의 데이터 구조를 나열하십시오. – mquander

+0

파이썬에 링크 된 목록이 내장 된 기초는 무엇입니까? http://stackoverflow.com/questions/280243/python-linked-list 및 기타 출처는 강력하게 의미하지 않습니다. "기본"목록 유형은 .NET 및 Java와 같은 배열 (http://mail.python.org/pipermail/python-list/2007-January/594523.html)을 기반으로합니다. –

0

저는 수년간 비즈니스 응용 프로그램 (.NET)을 개발해 왔으며 링크 된 목록을 사용한 한 인스턴스에 대해서만 생각할 수 있습니다. 그런 다음에도 개체를 만들지 않아도됩니다.

이것은 내 경험이었습니다.

0

나는 그것이 사용법에 달려 있다고 말하고, 어떤 경우에는 전형적인 랜덤 액세스 컨테이너보다 빠릅니다.

또한 일부 라이브러리에서는 기본 컬렉션 형식으로 사용되므로 링크되지 않은 목록처럼 보이는 것이 실제로는 아래에있는 것일 수 있습니다.

0

내가 마지막 회사에서 개발 한 C/C++ 응용 프로그램에서 우리는 항상 이중 연결 목록을 사용했습니다. 실시간 3D 그래픽이었습니다.

1

예, 연결된 목록을 사용하는 실제 응용 프로그램이 있습니다. 때로는 연결된 목록을 매우 많이 사용하는 거대한 응용 프로그램을 유지해야합니다.

예, 링크 된 목록은 C++/STL에서 .net에 이르는 거의 모든 클래스 라이브러리에 포함되어 있습니다.

그리고 대신 배열을 사용하고 싶습니다.

페이징 및 CPU 캐시 크기 때문에 실제 링크 된 목록은 느립니다 (링크 된 목록은 데이터를 확산시키는 경향이 있으며, 따라서 다른 메모리 영역에서 데이터에 액세스해야 할 가능성이 커집니다. 하나의 시퀀스에 모든 데이터를 저장하는 배열을 사용하는 것보다 오늘날의 컴퓨터에서는 훨씬 느립니다.

Google "자세한 참조 정보"를 참조하십시오.

+0

목록을 순회하는 것이 벡터 (C++ 데이터 구조 사용)보다 비효율적이라고 말하는 것 같습니다. 그러나 목록에는 상황에 따라 속도를 높이는 다른 속성이 있습니다. 일반적으로 vector <>를 사용합니다. 그러나 다른 데이터 구조는 다른 필요를 위해 존재한다는 것을 기억하십시오. –

+0

이것은 지나치게 단순한 그림입니다. 모든 데이터 액세스 패턴이 동등한 것은 아닙니다. 연결된 목록은 일부 앱에 매우 유용합니다 (예 : 큰 목록은 처음부터 삽입을 필요로하거나 중간에 삭제할 때. –

+0

@Matthew : 내 대답은 코드가 더 일반적인 것을 사용하거나 링크 된 목록으로 변경하거나 성능 테스트에서 제안한 것과 같이 작동하도록 만드는 것입니다. –

1

대학 숙제를 제외한 수공품 목록을 사용하지 마십시오.

+0

그것이 내가 생각했던 것이었고 나의 질문을 자극했다. 나는 그것을 읽는 것을 즐긴다. 그러나 생각하고 있었다. .. 아마 나는 이것을 많이 사용하지 않을 것이다. 감사. – johnny

+0

그것이 작동하는 방법을 아는 것은 나쁘지 않다고 생각합니다. 결국 쓸모없는 지식은 없습니다. –

0

예 모든 종류의 데이터 구조는 일상적인 소프트웨어 개발에 매우 ​​유용합니다. 내가 아는 대부분의 언어 (C/C++/Python/Objective-C)에는 이러한 데이터 구조를 구현하는 프레임 워크가 있으므로 바퀴를 다시 만들 필요가 없습니다.

그렇습니다. 데이터 구조는 학자 용 일뿐만 아니라 매우 유용하며 사용자가 수행하는 작업에 따라 소프트웨어를 작성할 수 없습니다.

메시지 대기열, 데이터 맵, 해시 테이블에서 데이터 구조를 사용하고 데이터 정렬 유지, 빠른 액세스/제거/삽입 등은 수행해야 할 작업에 따라 다릅니다.

2

단일 링크 된 목록은 "변경"할 수있는 메모리 효율적인 불변 목록을 갖는 유일한 방법입니다. Erlang이 어떻게하는지보십시오. 배열 지원 목록보다 약간 느릴 수 있지만 멀티 스레드 및 순전히 기능 구현에는 매우 유용한 속성이 있습니다.

+0

@ 칼 : OP는 "비즈니스"프로그래밍에 대해 질문했습니다. 나는 그가 당신의 사례를 "비즈니스"프로그래밍으로 간주 할 것인지 궁금합니다. –

0

예, 있습니다. 그것은 모두 상황에 달려 있습니다. 많은 데이터를 저장하지 않거나 특정 응용 프로그램에 FIFO 구조가 필요한 경우 구현하기가 빠르기 때문에 두 번째 생각없이 사용합니다.

그러나 다른 개발자를위한 응용 프로그램에서 링크 된 목록이 적합하지 않은 경우가 있습니다. 단, 빈약 한 지역이 많은 캐시 누락을 일으키는 경우는 예외입니다.

1

사용법에 따라 연결된 목록이 최상의 옵션 일 수 있습니다. 목록 앞에서의 삭제는 배열 목록보다 연결된 목록에서 훨씬 빠릅니다.

프로필을 유지 관리하는 자바 프로그램에서 처음에 많은 삭제가 있었던 목록의 경우 ArrayList에서 LinkedList로 이동하여 성능을 향상시킬 수 있다는 것을 보여주었습니다.

0

목록을 다루지 않는 많은 프로그램을 상상할 수 없습니다. 당신이 무언가의 1 가지 이상을 다룰 필요가있을 때, 당신은이 물건을 저장할 어딘가가 필요하기 때문에 모든 형태와 형태의 목록이 필요하게됩니다. 이 목록은 단일/이중 연결 목록, 배열, 집합, 키를 기준으로 항목을 인덱싱해야하는 경우 해시 테이블, 우선 순위 대기열 등이 될 수 있습니다.

일반적으로 데이터베이스 시스템에 이러한 목록을 저장하지만 드롭 다운 콤보 상자에 채우는 간단한 목록을 검색하는 것이 간단 할지라도 데이터베이스에서 가져 와서 응용 프로그램에 저장하고 조작해야합니다.

요즘 C#, Python, Java 등의 언어에서는 일반적으로 자신의 목록을 구현하지 않아도됩니다. 이러한 언어에는 컨테이너를 추상화하여 저장할 수있는 표준 라이브러리가 있거나 언어에 내장되어 있습니다.

당신은 여전히 ​​이러한 주제를 배우는 장점이 있습니다. C#으로 작업한다면 ArrayList가 어떻게 작동하는지 알기를 원할 것입니다. ArrayList를 추가하거나 삽입/검색/임의 인덱스를 추가 할 필요성에 따라 선택하십시오.