같은 목적에 맞는 다른 알고리즘 / 데이터 구조를 배우는 이유는 무엇입니까?


91

학부생이었던 이래로이 질문이 궁금합니다. 일반적인 질문이지만 아래 예를 자세히 설명하겠습니다.

최대 흐름 문제와 같은 많은 알고리즘을 보았습니다 .Ford-Fulkerson, Edmonds-Karp & Dinic과 같은 3 가지 알고리즘을 알고 있습니다.

데이터 구조 (예 : 힙)에는 이진 힙, 이항 힙 및 피보나치 힙이 있으며 피보나치 힙은 전체적으로 가장 복잡합니다.

나를 혼란스럽게하는 것은 : 우리가 그것들을 모두 알아야하는 이유가 있습니까? 왜 가장 복잡한 것을 배우고 익히지 않겠습니까?

나는 우리가 그것들을 모두 알고 있다면 그것이 최고라는 것을 안다. 나는 단지 어떤 문제 / 알고리즘이 A 를 사용하여 해결할 수 있지만 B가 아닌 등의 "더 유효한"이유가 있는지 알고 싶다 .


17
내가 항상 말했듯이 : 이것들은 (보통) "최고"가 아닙니다. "더 나은"이라는 의미를 명시 적으로 정의하면 그 대답이 분명해집니다.
Raphael

2
이것은 좋은 질문이지만, 당신이 고칠 수있는 당신의 교육에서 어떤 구멍을 고려할 것인지를 말해줍니다. 실제 경험입니다. 만약 당신이 실제로 교육 중에이 알고리즘들을 작성하지 않았다면, 지금 그것을 작성하는 것을 고려해 볼 수 있습니다.이 질문에 대한 답은 그 용도를 찾으려고했을 때 빨리 명백해 졌을 것입니다.
Sam

@ Sam 내 경험에 따르면, 강의 또는 일부 교과서에서 정보를 제공하고 많은 알고리즘, 분석 등을 소개하지만 A가 B를 능가하는 실제 사례 또는 샘플 시나리오는 많지 않습니다. 알고리즘 A에서 Z까지의 장르와 숙제 문제가 있지만 나에게 모두 A 또는 Z만으로 해결할 수 있으므로 질문이 제기되었습니다.

5
최적의 알고리즘보다 덜 배우는 가장 실질적인 이유는 학문적 관심을 버려야한다고 주장하는 경우 알고리즘을 인식하고 최적의 알고리즘으로 리팩토링하여 알고리즘을 최적화 할 수 있습니다. 활과 화살이 무엇인지 모르는 경우 활과 화살을 총으로 업그레이드 할 수 없습니다.
candied_orange

1
실제로 이와 같은 CS 교육 질문에 도움이되는 StackExchange 사이트를 제안했습니다. 여기에 우리를 지원하십시오 : area51.stackexchange.com/proposals/92460/…
vk2015

답변:


121

Data Structures, Algorithms 및 Tradeoffs 라는 제목의 교과서가 어느 시점에 작성되기를 기다리고 있습니다 . 학부 수준에서 배우게 될 거의 모든 알고리즘 또는 데이터 구조에는 일부 응용 프로그램보다 다른 응용 프로그램보다 더 나은 기능이 있습니다.

모든 사람이 표준 정렬 알고리즘에 익숙하기 때문에 정렬을 예로 들어 봅시다.

우선, 복잡성 만이 유일한 관심사가 아닙니다. 실제로 상수 요소가 중요하므로 빠른 정렬이 최악의 복잡한 경우에도 빠른 정렬이 힙 정렬보다 더 많이 사용되는 이유가 있습니다.

영형(로그)

다른 경우에는 알고리즘 또는 데이터 구조의 아이디어가 특수 목적의 문제에 적용될 수 있습니다. 버블 정렬은 실제 하드웨어에서 삽입 정렬보다 항상 느린 것처럼 보이지만 버블 패스를 수행한다는 아이디어는 때로는 정확히 필요한 것입니다.

예를 들어, 성능상의 이유로 가장 가까운 카메라에서 가장 가까운 카메라에 이르기까지 객체를 그리려는 최신 비디오 카드의 일종의 3D 시각화 또는 비디오 게임을 고려하십시오. 주문이 정확하지 않으면 하드웨어가 처리합니다. 3D 환경을 이동하는 경우 프레임간에 개체의 상대적 순서가 크게 바뀌지 않으므로 프레임마다 하나의 버블 패스를 수행하는 것이 합리적 일 수 있습니다. Valve의 소스 엔진은 파티클 효과를 위해이를 수행합니다.

지속성, 동시성, 캐시 로컬 성, 클러스터 / 클라우드에 대한 확장 성 및 관심있는 작업에 대해 동일한 계산 복잡성을 고려할 때 하나의 데이터 구조 또는 알고리즘이 다른 데이터 구조 또는 알고리즘보다 더 적합한 다른 여러 가지 이유가 있습니다.

그렇다고해서 만약에 대비해서 많은 알고리즘과 데이터 구조를 기억해야한다는 의미는 아닙니다. 대부분의 전투는 처음부터 악용 될 트레이드 오프가 있음을 인식하고 적절한 것이 있다고 생각되면 어디를 볼 것인지를 아는 것입니다.


7
훌륭한 예를 가진 큰 대답! 심지어 거품 패스를 몰랐 ... 현실 세계에서의 실용화를 가지고
shole

1
@shole 게임 사업에 대한 경험이 많지 않지만 위의 모든 사항은 다양한 정도에 중요합니다. (물론, 당신은 게임에 필요한 알고리즘, 데이터 구조, 그리고 수학의 종류는 아마 데이터베이스 또는 생물 정보학 또는 무엇을 필요 다릅니다.) 내가 당신이라면, 여기 가서보고 시작 했죠 : handmadehero합니다. org 또한 gamedev.stackexchange.com에
가명

1
캐시 효율성은 과도하게 연구되지 않은 큰 요소입니다 (Google "memory wall").
Raphael

6
조심스럽게, Quicksort는 평균적 으로 Heapsort보다 훨씬 빠르지 만 Heapsort는 더 일관성이 있습니다 (실행 시간의 편차가 적고 최악의 경우가 훨씬 좋습니다). 캐시 / 페이징이 시작되면 힙 및 소프가 어레이에서 뛰어 다니는 것과 왼쪽에서 오른쪽으로 퀵소트의 선형 스캔이 크게 달라집니다.
vonbrand

1
@shole 어떤 종류의 게임 개발에 관심이 있습니까? 3D 그래픽과 게임 플레이 (AI 포함)라는 두 개의 매우 다른 하위 필드가 있습니다. 나는 그래픽에 대한 경험이 있지만 데이터 구조와 수학은 그래픽과 알고리즘에서 매우 중요하며 덜 중요한 요소 라고 말할 수 있습니다 . 엔진을 사용하는 경우이 대부분의 내용은 물론 처리되지만 3D 지오메트리의 기본 수학을 이해해야합니다.
gardenhead

51

수많은 머신 모델 (TM, RAM, PRAM 등)에 대한 수많은 비용 측정 (실행 시간, 메모리 사용량, 캐시 누락, 분기 오해, 구현 복잡성, 검증 가능성 등)이 있다는 사실 외에도 , 평균 대 최악의 경우 및 서로를 비교하기위한 상각 고려 사항은 종종 기본 교과서 사양의 범위를 넘어 기능상의 차이가 있습니다.

몇 가지 예 :

  • Mergesort는 Quicksort가없는 곳에서 안정적입니다.
  • 이진 검색 트리는 순서대로 반복을 제공하지만 해시 테이블은 그렇지 않습니다.
  • Bellman-Ford는 네거티브 엣지 웨이트를 처리 할 수 ​​있지만 Dijkstra는 할 수 없습니다.

또한 교훈적인 고려 사항 이 있습니다 .

  • 간단한 솔루션보다 더 복잡한 솔루션을 이해하는 것이 얼마나 쉬운가요? (BST가없는 AVL 트리 (및 해당 분석); Ford-Fulkerson이없는 Dinic; ...)
  • 많은 솔루션에 노출되는 것과 비교하여 문제당 하나의 솔루션에만 노출 될 때 동일한 원리와 패턴이 보입니까?
  • 문제당 하나의 솔루션에 대한 설명만으로도 숙달을위한 충분한 교육이 제공됩니까?
  • 어떤 솔루션이 발견되었는지 폭을 알고 있어야합니까 (휠을 계속해서 재발견하는 것을 방지하기 위해 ¹)?
  • 문제당 하나의 솔루션에만 노출되는 경우 실제 프로그래밍 라이브러리와 같은 다른 솔루션을 이해할 수 있습니까?

  1. 이것은 풍부한 CS 도구 상자가없는 프로그래머 유형에서 많이 볼 수 있습니다.

4
교훈적인 근거를 포함하여 +1! 몇 가지 이론적 근거 (특히 두 번째 및 세 번째)와 관련하여 알고리즘 및 데이터 구조가 어떻게 개발되고 최적화되는지 확인하면 개발 및 최적화 기술과 트레이드 오프에 대한 이해 ( "무엇"뿐만 아니라 "어떻게"뿐만 아니라 "어떻게"를 배우는가) ).
Paul A. Clayton

2
또 다른 고려 사항은 다른 대안 을 분석 하면 비정상적인 설정에 대한 새로운 알고리즘을 분석하는 유용한 도구의 예를 제공 한다는 것입니다.
vonbrand

1
좋은 지적이야, @vonbrand. 스플레이 트리의 동작을 이해하기 위해 상각 된 복잡도 분석이 발명되었지만 스플레이 트리는 실제로 거의 사용되지 않습니다. 어쨌든 출판 된 나무는 재생되지 않습니다. Windows NT 커널은 스플레이 트리를 사용하여 가상 메모리 맵을 구현하는 것으로 유명하지만 모든 조회에서 순서를 바꾸지는 않습니다.
가명

1
@vonbrand 예. 그래도 알고리즘 클래스의 도구 상자 차원에 주로 관심이있는 사람이 그러한 이유로 비웃는 방법을 이해할 것입니다.
Raphael

7

에서 현실 세계 , 어떤 시점에서 당신은 다른 사람의 팀에 의해 작성되었습니다 소프트웨어 작업이 될 가능성이 높다. 이 소프트웨어 중 일부는 태어나 기 전에 작성되었을 것입니다!

사용되는 알고리즘 / 데이터 구조를 이해하려면 더 이상 "최신 상태"로 간주되지 않는 옵션을 포함하여 많은 알고리즘 / 데이터 구조를 아는 것이 매우 도움이됩니다.

또한 표준이 아니며 작업중인 응용 프로그램에서만 사용되는 알고리즘에 대해서도 작업해야합니다. 이 알고리즘을 개선해야 할 때 다른 사람들이 알고리즘을 개선 한 방법을 연구 한 것처럼 두뇌가 알고리즘을 개선하는 유용한 방법으로 채워져 있음을 알게 될 것입니다.

이것이 바로 컴퓨터 공학을 공부 한 사람이 프로그래밍 방법을 배운 사람과 다른 점입니다. 내가 일한 대부분의 일에서 컴퓨터 과학을 공부했을 때“도서에서 배운”프로그래머가 할 수 없었던 문제를 해결할 수 있었지만 컴퓨터 과학을 공부 한 것이 나에게 도움이되지 않는 시간의 95 %를 해결할 수 있는 시간이 있었다 다른 숙련 된 프로그래머보다 .


해결하려는 것들의 95 %가 기계 학습과 관련이없는 한. 정상적인 프로그래머가 실제 ML 문제가 직면 한 문제를 시도 할 수있는 올바른 기회를 얻는 방법을 알 수 없습니다.
Pinocchio

3
목표 : 5 %보다 좋은 취업률을 얻습니다.
Raphael

CS를 공부하는 것은 알고리즘 및 데이터 구조에 대한 지식을 수집하는 좋은 방법이었습니다. 코딩 코더에게있어 최고의 직업입니다.
greybeard

5

많은 사람들이 최고의 알고리즘이 하나도 없다고 올바르게 언급했습니다. 상황에 따라 다릅니다.

언젠가 낯선 상황을 경험할 가능성도 있습니다. 당신이 알고 더 많은 알고리즘, 당신의 하나 알 수있는 더 많은 기회가 거의 당신이 기본으로 사용할 수있는 솔루션을.


5
이 답변은 오래된 포인트의 포인트 만 반복합니다.
Raphael

1

라파엘의 대답은 이것을 다소 언급하지만 많은 훌륭한 답변, 내가 생각하지 못하는 것.

구현의 용이성도 고려해야합니다.
대부분의 플랫폼 / 언어에는 이미 구현 된 (그리고 종종 할 수있는 것보다 더 나은) 것이 있기 때문에 정렬 알고리즘에는 문제가되지 않지만 더 특이한 알고리즘은 사용하지 못할 수 있습니다.
문제점에 따라 구현 시간이 1 일 대 2 주인 경우 절대 최상의 알고리즘이 필요하지 않을 수 있습니다.

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