프로그래밍이나 컴퓨터 과학은 일반적으로 알고리즘에 관한 것입니까?


40

대학원생으로서 Google, Facebook, Microsoft 등의 유명한 회사에서 테스트 및 인터뷰에 알고리즘 질문을하는 것이 점점 더 일반적입니다. 내가 신청 한 몇몇 신생 기업은 알고리즘에 대해서도 물었다. 해당 회사의 소프트웨어 개발자에게 알고리즘 유창성이 가장 중요한지 궁금합니다.

대답이 '예'인 경우 알고리즘에 대해 효과적으로 배우고 연습 할 수있는 가장 좋은 방법이나 리소스는 무엇입니까? 대부분의 교과서 나 웹 사이트에서 발견되는 너무 복잡한 문제를 해결하는 데 관심이없는 것 같습니다. 기본 알고리즘 (quicksort, bubblesort 등)을 쉽게 이해할 수 있지만 나중에 기억하고 재사용하는 것은 매우 어려운 일입니다.

감사.

P / S : 내가 좋아하는 것을 묻는다면 사용자의 문제를 혁신적으로 해결할 수있는 좋은 소프트웨어를 만들고 있습니다. 필자가 소프트웨어가 매우 복잡해야한다는 의미는 아닙니다.


26
텍스트 상자와 버튼으로 웹 전체를 검색하는 것이 Google이 얼마나 복잡한 지 아십니까?
JeffO

21
@JeffO 더 이상 버튼을 사용하지 않습니다 ;-)
maple_shaft

1
Google이 더 쉬워지면 다른 모든 검색 사이트에는 코드가 전혀 필요하지 않습니다.
JeffO

CPU 작동 방식, RAM 작동 방식, Wi-Fi 작동 방식 등과 같은 컴퓨터 작동 방식에 대한 의문이 있다고 생각했습니다. 이러한 흥미로운 질문은 여전히 ​​많은 연구가 필요합니다. Java 또는 PHP로 프로그래밍하는 모든 괴짜보다 하드웨어가 더 훌륭하다고 생각합니다.
jokoon February

2
알고리즘에 관한 것이 아니라 실제로 CS의 핵심에 있습니다. 그러나 단지 알고리즘과 논리보다 프로그래밍에 더 많은 것이 있습니다 (예를 들어, 코드 유지 는 알고리즘에 대한 지식 요구하지 않습니다 ).
haylem

답변:


44

알고리즘은 분명하다

여기에 알고리즘에 대한 아름다운 점이 있습니다. 그들이 다루는 문제 공간은 잘 정의되어 있습니다. 즉, 요구 사항은 실제로 알려질 뿐만 아니라 솔루션 품질에 대한 메트릭과 같이 형식화되기도합니다.

따라서 알고리즘을 제안하면 통신 문제의 가능성이 크지 않으며 성능을 측정하는 것이 쉽지 않습니다. 동시에 성과는 논리적으로 생각할 수있는 능력을 나타내는 상당히 좋은 지표입니다.

알고리즘은 효율적인 필터입니다

업계 (및 교육)의 현재 문제는 졸업생의 평균 품질이 낮다는 것입니다. 이것은 FizzBuzz 테스트에서 설명되었습니다 .

프로그램을 작성하십시오. 1에서 100까지의 숫자를 거쳐 숫자를 3으로 나눌 수 있으면 "fizz", 5로 나눌 수 있으면 "buzz", 나눌 수 없으면 숫자 자체를 인쇄합니다.

모든 Comp Sci 졸업생의 대다수는이 문제를 해결하지 못하는 것 같습니다. 당연히 간단한 질문이지만, 이것은 알고리즘적인 질문입니다. 이를 통해 Google Code Jam 또는 Project Euler와 같은 문제를 해결할 수있는 사람을 확보하면 이미 crème-de-la-crème을 즐기고 있습니다.

알고리즘은 소프트웨어 개발의 작은 부분입니다

실제로 업계에서 일하자마자 알고리즘 기술을 1 % 이상 사용하지 않을 것입니다.

코드 작성을 시작하기 전에 먼저 요구 사항을 수집하고 분석해야합니다. 그런 다음이를 기반으로 디자인을 합성해야합니다. 그런 다음 디자인을 구현해야합니다. 그런 다음 원래 요구 사항에 대해 구현을 평가 한 다음 요구 사항을 반복 한 다음 디자인을 반복 한 다음 구현을 반복해야합니다.

요구 사항 중 하나는 합리적인 성능입니다. 해당 요구 사항이 충족되지 않으면 병목 현상을 추적하기 위해 구현을 프로파일 링 한 다음 최적화 할 수 있습니다. 때로는 미세한 최적화 (일부보다 쉬운) 문제이지만 때로는 문제가됩니다. 더 나은 알고리즘을 사용합니다. 따라서:

알고리즘이 중요하다

알고리즘을 더 잘 파악할수록 처음으로 알고리즘을 얻을 가능성이 커집니다. 그렇지 않으면 더 나은 알고리즘을 구현해야만 해결할 수있는 문제가 발생할뿐만 아니라 실제로 해결할 수도 없습니다.
따라서이 기술이 거의 필요 하지는 않지만 개발 방법론에서 단일 실패 지점을 제시하며 , 기술이 없으면 필요성이 절대 발생하지 않거나 다른 사람이이를 해결하기 위해 뛰어 들기를 희망 할 수 있습니다. 당신.

실제로 중요한 것은 비슷한 질문에 대한 응답으로 설명했듯이 계산 복잡성에 대한 느낌과 그것을 낮게 유지하는 방법을 얻는 것입니다 . 또는 GUI 개발과 같이 이것이 중요하지 않은 것들을 전문으로 취급하지만 거의 모든 사람들이 그것을 싫어합니다.


5
매우 포괄적이고 지능적인 답변을 얻으려면 +1하십시오. 또한 FizzBuzz 필터가 얼마나 효과적인지 슬프다. 그것을 할 수 없다는 것에 대한 변명이 없습니다.
Adam Crossland

4
fizzbuzz모듈로 검사를 신중하게 주문해야하기 때문에 숫자를 모두 나눌 수 있고 많은 사람들이 미끄러지면 인쇄해야한다고 생각했습니다 .
Matthieu M.

1
1 %가 약간 높을 수 있습니다
대마

1
@MatthieuM .: 두 가지 모두를 인쇄하는 것은 요구 사항이 어떻게 표현되는지에 내재되어 있습니다. 이를 누락하면 요구 사항을주의 깊게 확인하지 않은 것입니다. 지금, 내가 흥미롭게 생각하는 것은 당신이 그것들을 어떤 특정한 순서로, 심지어는 같은 순서로 인쇄해야한다고 말하지 않는다는 것입니다.
jmoreno

1
@ back2dos : 예, 그러나 임의의 순서로 수행하는 것이 더 재미있는 것처럼 들립니다 ...이 답변에 주어진 요구 사항은 행을 언급하지 않고 인쇄 만한다는 점에 유의하십시오 . FizzBuzz 테스트를 받았다면, 여기에 많은 추정되지 않은 가정이 있음을 지적하는 것이 좋습니다 (그런 다음 다시 당신을 현명한 사람으로 칠할 수 있습니다).
jmoreno 2016

30

일반적으로 직업 프로그래밍은 알고리즘에 관한 것이 아닙니다. 심도있는 알고리즘 기술 없이도 CRUD 응용 프로그램을 프로그래밍하는 데 몇 년을 보낼 수 있습니다.

직업 프로그래밍은 다음과 같습니다.

  1. 통신:

    • 소스 코드는 아이디어를 동료에게 전달하는 수단입니다. 아무도 코드를 읽거나 이해할 수 없다면 쓸모가 없습니다.

    • 다른 개발자와 이야기하지 않는 고독한 개발자는 아마도 코드에서 실수를 시작하고 자신의 접근 방식이 유일하게 받아 들일 수 있다고 생각할 것입니다.

    • 이해 관계자, QA 부서, 사용자, 비주얼 디자이너, DBA 등과 의사 소통하는 방법을 알아야합니다.

    • 숙련 된 개발자는 기술을 향상시키고 자하는 경험이 적은 동료를 가르쳐야합니다.

  2. 올바른 도구에 대한 지식 : 버전 관리, 버그 추적 시스템, IDE, 특정 작업에 더 적합한 언어 및 이유, 코드 분석 사용 방법 등

  3. 광범위한 지식과 문화 : 기능적 언어 란 무엇입니까? 컴퓨터가 코드를 해석하는 방법 왜 LOC가 의미가없는 측정입니까? 기타

  4. 작업하는 언어에 대한 깊은 지식

  5. 알고리즘.

반면에 컴퓨터 과학은 알고리즘에 더 중점을 둡니다. 과학자로 일하는 경우 이는 개발자의 업무와 관련이 없을 수 있으며 알고리즘 최적화 방법, 데이터 표현을 다른 것으로 변환하는 방법 등에 대해 더 많이 연구하게됩니다.


12
-1 : "CRUD 응용 프로그램" 알고리즘입니다. 그것들은 단지 (일반적으로) 단순합니다. "고귀한 의미"는 없습니다.
S.Lott

2
소스 코드는 않는 컴퓨터에 유일한 통신 채널입니다 정확히 당신이 할 (그리고 여러분이 원하는 거의 절대 무엇을) 말할 것
래칫 괴물

5
엔지니어링 팀이 알고리즘의 기본 사항을 무시했거나 배운 적이없는 CRUDdy 애플리케이션을 정리하는 데 시장이 얼마나 좋은지 놀랍습니다.
JasonTrue

2
@ S.Lott : "CRUD 응용 프로그램은 알고리즘입니다"는 "I am America"와 유사합니다. ;)
Jim G.

1
@JimG : Steven Colbert가 "나는 미국이고 그렇게 할 수있다"고 말합니다. CRUD 응용 프로그램은 알고리즘을 포함, 기반, 포함, 구현, 구현, 구현, 반영합니다. 당신은 특정한 전치사를 제안하지 않고 단지 불평했다. 어느 것이 당신을 더 행복하게 만들었습니까?
S.Lott

16

인터뷰에서 알고리즘에 대한 질문은 기업이 컴퓨터 과학의 기본에 대한 후보자의 파악을 판단하려고하는 주요 방법 중 하나라고 생각합니다. 이것이 전문 프로그래머에게는 유일하게 중요한 기술 영역은 아니지만, 훌륭한 프로그래머의 핵심 역량 중 하나입니다.

많은 대기업들이 인터뷰 과정에서 CS 기초를 강조하는 이유는 그것이 졸업하고 노동력에 들어간 후 가장 적게 개발 된 핵심 기술이기 때문이라고 생각합니다. 실질적인 프로그래밍 능력, 디자인 기술, 소프트웨어 엔지니어링 실습 등은 주로 경험을 통해 개발되는 것이며 CS 기초는 주로 교육 과정에서 개발됩니다.

알고리즘 설계를 연습하는 방법에 대해 Steve Yegge 는 프로그래머로서의 인터뷰 에 대한 훌륭한 안내서 에서 Skiena의 The Algorithm Design Manual 을 권장 합니다 .


4
+1 : 프로그래밍 언어, 프레임 워크, 운영 체제, 편집자, 툴셋, 모두 사라지고 있지만 문제를 효과적으로 해결하는 방법을 아는 것은 데이터 구조와 알고리즘의 기본을 아는 것과 관련이 있습니다. 이 일은 항상 우리와 함께 있습니다.
Adam Crossland 2019

"알고리즘 디자인을 연습하는 방법에 대해 Steve Yegge는 프로그래머로서의 인터뷰에 대한 훌륭한 안내서에서 Skiena의 The Algorithm Design Manual을 추천합니다." 죄송하지만이 학생이 대학원생이되어이 질문을 한 사람에게는 해당되지 않을 수 있습니다. Google / MS는 Skiena (학년 학생들을위한)에서 국제적인 대학 프로그램 경쟁에 등장한 질문을 던졌습니다. (이것은 일화 적 경험에서 확실히 알고 있습니다). Skiena의 책은 여전히 ​​사용되지만 주로 저학년 수준의 후보자에게 사용됩니다.
user396089

프로그래밍 대회에 표시되는 질문에 관해서는 - 당신이 전에 질문을 본적이 없다면 당신은 꽤 많이 씻어 버렸어요있다 (당신의 IQ는 3 SD 떨어져 정상에서 될 일이 아닌 경우)
user396089

11

자체 교육을 받았으며 대학에서 몇 가지 컴퓨터 과학 과정을 수강 한 성공적인 소프트웨어 개발자로서 오늘날 비즈니스가 직면하는 가장 큰 문제는 모든 프로그래머가 가장 효율적인 방식으로 거품 정렬 알고리즘을 작성할 수있는 능력이 아니라고 말할 것입니다 가능한. 기업이 직면 한 진정한 문제 :

  • 새로운 도메인을 빠르게 배우고 적응할 수없는 개발자

  • 의미있는 방식으로 고객 또는 이해 관계자와 사회적으로 상호 작용할 수없는 개발자

  • 비즈니스 요구 사항을 잘못 추측하거나 잘못 생각할 수없는 개발자

  • 코드와 기능을 철저히 테스트하는 방법을 이해하지 못하는 개발자

  • 시기 적절하게 의미있는 견적을 제공 할 수없는 개발자

  • 명확하고 간결한 문서를 만들 수없는 개발자

  • 스스로 시작할 수 없거나 상황을 책임질 수없는 개발자

열 개 중 아홉 번 나는 회사에서 개발자가 실수하는 거의 모든 상황이 위의 품질 중 하나에서 절망적으로 실패했기 때문에 베팅 할 것입니다. Google과 Facebook은 잊어 버리고 예외 사례이며 컴퓨터 과학을 깊이 이해하는 사람들이 합법적으로 필요합니다.

실제 비즈니스는 컴퓨터 과학의 복잡성으로 어려움을 겪지 않지만 인류의 복잡성으로 어려움을 겪습니다. 문제는 위에서 언급 한 품질을 테스트하기가 매우 어렵다는 것입니다. 대부분의 경우 장 반응에 따라 이러한 자질을 판단해야합니다. 좋은 사람의 기술과 직관이 없으면 어렵습니다. 알고리즘 지식을 테스트하는 것이 훨씬 쉽습니다.


+1 정기 및 비 구글과 같은 회사에는 우수한 비즈니스 기술을 갖춘 사람이 필요하며 주로 프로세스를 발명 / 적용 / 관리 / 수정하는 방법을 이해해야합니다. 컴퓨터 과학이 비즈니스 문제를 해결하는 것이 아니기 때문에 Google과 같은 회사가 애자일 운동을 해치지 않은 것은 실수가 아닙니다.
S.Robins 2012

10

저는 개인적으로 프로그래머의 어휘의 일부로 "표준"알고리즘과 데이터 구조를 봅니다. 그리고 프로그래머로서 직면 한 많은 실제 문제는 종종이 어휘에서 (적어도 부분적으로) 표현할 수있는 솔루션을 가지고 있습니다.

이 어휘를 여러분의 처분으로 사용하면 "자신의"솔루션을 만들지 않아도되고 (바퀴를 재창조) 더 똑똑하고 자주 일할 수 있습니다.

"대부분의 교과서 나 웹 사이트에서 볼 수있는 너무 복잡한 문제를 해결하는 데 관심이없는 것 같습니다."

"나중에 그것들을 기억하고 재사용하는 것은 엄청나게 어렵다"

스스로 완성하도록 강요하십시오. 나중에 스스로에게 감사 할 것입니다. 충분히 자세하게 기억하지 않더라도 (실제로 연습해도 충분하지만) "알고리즘 X 또는 데이터 구조 Y를 사용하여 비슷한 것을 해결하는 것을 기억합니다"라고 말할 수 있다면 엄청난 도움이 될 것입니다. 세부 사항을 찾아 메모리를 새로 고쳐야하는 경우에도 마찬가지입니다.


데이터 구조의 경우 +1 그것들은 알고리즘 코인의 다른 절반입니다.
스펜서 Rathbun

9

알고리즘을 모르면 훌륭한 프로그래머가 될 수는 없지만 프로그래밍 직업의 다른 측면을 그림에서 벗어나는 것은 불공평합니다. 예를 들어, 모국어에 대한 엄격한 훈련과 훌륭한 명령은 알고리즘에 대한 지식만큼이나 훌륭한 프로그래머가되는 것만 큼 중요합니다. 프로그래밍 언어, 소스 제어 시스템, 테스트 환경 등과 같은 기본 도구 이해의 중요성을 과소 평가해서는 안됩니다.

그러나 인터뷰와 관련하여 알고리즘에 대한 이해를 측정하는 것은 프로그래머로 일하는 것과 관련된 다른 능력을 측정하는 것보다 훨씬 간단합니다. 그렇기 때문에 면접관은 종종 알고리즘에 대한 질문에 집중하고 면담 중에 설명하는 방식에주의를 기울입니다. 다른 것들이 덜 중요하기 때문이 아니라 인터뷰에 할당 된 30 분 안에 이러한 다른 것들을 평가하기가 어렵 기 때문입니다.


1
+1 완벽한 답변! 알고리즘 지식을 테스트하는 것이 더 쉽습니다.
maple_shaft

"귀하의 알고리즘"-나는 스스로 가르칩니다. 모든 프로그래머가 알아야 할 공통 알고리즘이 무엇인지 알려주는 소스 나 목록이 있습니까? 나는 그들을 통해 읽고 싶습니다. 감사!
Ominus

2
@Ominus 알고리즘의 "gentleman 's list"에 대한 일반적인 합의는 없지만, 대부분의 경우 공간 연속성이 결여 된 데이터 구조 (링크 된 목록, 이진 트리 등) 및 기본 (mis) 검색, 정렬, 탐색이 포함됩니다. 재귀의 응용 (재귀 적 팩토리얼, 피보나치 시퀀스 등)
dasblinkenlight

@Ominus-나도 독학했지만 "알고리즘 소개"라고 생각합니다.-CLRS는이 분야에 익숙해지는 좋은 방법입니다. Skiena의 책 "Algorithm Design Manual"도 좋습니다.
Tod

5

예, 프로그래밍은 대부분 알고리즘에 관한 것입니다.

그러나 아마도 당신이 생각한다는 의미가 아닐 수도 있습니다.

우리 모두 알고리즘의 다른 정의를 사용하고 있다는 인상을받습니다. 솔직히 말하면 알고리즘은 모호한 용어이기 때문에이 질문에 대답하기가 어렵습니다. 이 질문에 답하기 위해 Wikipedia의 정의를 사용하겠습니다.

일련의 작업을 정확하게 정의하는 규칙 집합입니다.

이것이 프로그래밍의 핵심입니다. 당신이 쓸 때 어떤 코드를, 당신은 단지 알고리즘을 구현하고 있습니다. 일부 CRUD 응용 프로그램을 작성하는 경우 간단한 알고리즘을 구현하고 있습니다. 문제를 해결하기 위해 알고리즘을 생각해 낼 수있는 것은 프로그래밍입니다. 나머지는 세부 사항입니다.

알고리즘을 이해하는 것보다 언어를 깊이 이해하는 것이 중요하다는 이전 포스터에 동의하지 않습니다. 좋은 프로그래머라면 언어를 깊이 배울 수 있어야하지만, 알고리즘이 없으면 어떤 코드도 스스로 만들 수 없습니다.


다른 관점에서, 수학에서 마음과 영혼 은 알고리즘 일 수 있지만 프로그래밍의 경우 다른 것입니다. 알고리즘 자체를 필요로하지 않고 소프트웨어를 작성할 수 있지만 (아마도 좋은 소프트웨어는 아님) 논리와 추상적 사고 없이는 소프트웨어를 작성할 수 없습니다. 그것의에서 마음 그러나, 문제를 해결합니다. 솔루션을 찾는 것은 알고리즘 프로세스이지만 솔루션 자체는 반드시 알고리즘 일 필요는 없습니다.
S.Robins 2012

4

답은 당신이 추구하는 일에 전적으로 달려 있습니다. 일부 필드는 다른 필드보다 특히 알고리즘 중심입니다. 나는 아마존과 여러 번 인터뷰하는 것이 즐거웠지만 그 메모에 대해 말하기. 이 복잡한 알고리즘과 관련이 거의 없지만, 작업을 일정한 시간으로 상각시키는 방법에 대해 나는 구부렸다.

알고리즘에 대한 강력한 이해가 제공하는 것은 잠재적 고용주에게 귀하가 적절한 문제 해결사라는 증거입니다. 실제로 훌륭한 직원의 좋은 지표 (IMO)는 아니지만 일부 고용주는이를 심사에 사용합니다. 대학원 학위가 필요한 직책을 신청하는 경우 알고리즘에보다 엄격한 기초가 있어야합니다.

실제로 (IMO)가 실제로 도움이되는 것은 특정 알고리즘을 암기하는 것이 아니라 일부 알고리즘의 작동 방식을 이해함으로써 당신의 마음 뒤에는 "이전에 본 적이 있습니다"또는 "나는 알고 있습니다. 이 문제를 더 잘 해결할 수 있습니다 "는 문제에 대한 해결책에 대한 약간의 연구를 낳을 것입니다.


대학원생 채용 바에 대해 +1 일부 회사는 저학년 학생보다 대학원생을 고용 할 때 훨씬 더 열악합니다. 그러나 그들에게 공평하게, 대학원생들도 더 나은 보수를받으며 일반적으로 더 높은 수준의 내부에서 채용됩니다.
user396089

1

저는 항상 프로그래밍이 알고리즘보다 데이터 중심적이라고 생각합니다.하지만 데이터를 처리하지 않으면 데이터가 어떤 용도로 사용됩니까? 모든 조작은 알고리즘입니다. 실제로, 프로그래밍은 거의 전적으로 알고리즘 기반입니다.

수학처럼 보이지 않을 수도 있고 일상적으로 수행하는 많은 알고리즘 작업은 GUI와 프로그램간에 데이터를 보내는 것과 매우 유사하지만 알고리즘으로 간주됩니다. 목록 상자에 요소 삽입은 성능 및 목록 구조 조작과 같은 자체 문제와 함께 제공되는 표준 삽입 알고리즘입니다.


1

해당 회사에서 일하는 프로그래머 만이 실제로 귀하의 질문에 대답 할 수 있습니다. "알고리즘 소개"에서 다루는 알고리즘 종류는 아마도 지난 25 년 동안 프로그래밍 수명의 0.01 %에 영향을 미쳤을 것입니다. 데이터 구조 또는 정렬이 필요할 때 일반적으로 제공된 라이브러리 또는 프레임 워크에 필요한 것이 있습니다. 초고속 FFT가 필요할 때 직접 작성하지 않고 Intel Math 라이브러리와 같은 것을 찾습니다. 그러나 Google에서 그들이하는 일이 내가 직장에서했던 것과 어떻게 다른지 알 수 있습니다. Skiena의 저서 "알고리즘 디자인 매뉴얼"은 그가 전하는 전쟁 이야기 때문에 눈을 뜨게되었습니다. 그가 자신의 직업 ALOT에서 알고리즘을 사용한다고 말할 수 있습니다.

독립적 인 프로그래밍 컨설턴트로서의 경험에서 성공은 세 가지에서 비롯되었습니다. 1. 고객과 효과적으로 의사 소통하기 2. 작동하는 코드 작성. 3. 복잡성 관리

숫자 1과 2만으로는 충분하지 않습니다. 코드를 작성할 수있는 프로그래머가 아닌 다른 사람이 코드를 유지 관리 할 수 ​​없으면 파산됩니다.

3 번은 마스터하기 가장 어려운 프로그래밍 기술입니다. 아키텍처, 디자인 및 코딩에 대한 생각이 필요합니다. 마스터 리팩토링이 필요합니다. SOLID / DRY 원리를 이해해야합니다. 알고리즘 입문을 읽고 자신을 마스터하는 데 헌신 한 프로그래머 또는 Pragmatic Programmer를 읽고 자신이 하나가되도록 헌신 한 프로그래머를 고용해야한다면 매번 후자를 고용 할 것입니다. (그들은 상호 배타적이어야 함).


1

예.

컴퓨터 과학은 대부분 알고리즘 (백분율)입니다.

아니.

그러나 이것이 컴퓨터의 "과학"입니다. 컴퓨터 과학의 가장 일반적인 응용은 소프트웨어 공학입니다. 소프트웨어 엔지니어링은 주로 알고리즘이 아닙니다. 주로 창조의 기술, 완벽 추구에 관한 것이며 오늘날 존재하는 실제 사람들의 삶에 긍정적 인 영향을 미칩니다. 컴퓨터 과학은 같은 동기 부여를 공유 할 수 있지만 소프트웨어 공학과는 거리가 멀다.

주요 컴퓨터 과학 대학의 임기 교수에게 프로그래밍에 대해 이해해야 할 가장 중요한 것이 무엇인지 물어 보면 "알고리즘과 데이터 구조"라고 말할 것입니다.

주요 소프트웨어 회사의 선임 개발자에게 프로그래밍에 대해 이해해야 할 가장 중요한 것이 무엇인지 물어 보면 "고객 만족을위한 학습"(민첩성 이해, 고객 생각, 정시 배송 및 지속적으로 작동 하는 것들 등 만들기 )

의미론처럼 보일 수도 있지만, 내 이해로 볼 때 두 가지가 실제로는 이론적으로 현저히 다릅니다.


1

컴퓨터 과학에서 가장 중요한 부분을 골라야한다면 알고리즘이 아닌 추상화를 선택했습니다 .


1

Computer Science에서 배우는 개념은 보여줄 때까지 아무 소용이 없습니다. 문제는 해결해야 할 주요 관심사이므로 알고리즘은 일반적인 문제 해결 방법에 대한 간단한 계획입니다. 따라서 컴퓨터 과학 세계에서 주요 관심사입니다.

나는 컴퓨터 과학의 거의 모든 측면에서 알고리즘이 필요하다고 생각한다.

오토마타

파워 셋 구성. 비 결정적 오토 마톤을 결정 론적 오토 마톤으로 변환하는 알고리즘. Todd-Coxeter 알고리즘. 코셋 생성 절차.

인공 지능

알파-베타. 알파 최대 + 베타 최소 보드 게임에서 널리 사용됩니다. 개미 알고리즘. 개미 식민지 최적화는 문제를 해결하고 두 위치 사이에서 가장 좋은 경로를 찾기 위해 개미 행동에서 영감을 얻은 알고리즘 세트입니다. DE (차등 진화). Chebyshev 다항식 피팅 문제를 해결하십시오. 온라인 제품 리뷰에서 Sarcastic 문장의 반 감독 인식 . 트윗이나 온라인 문서에서 사 카리스 또는 아이러니를 인식하는 알고리즘. 이러한 알고리즘은 휴머노이드 로봇 프로그래밍에도 필수적입니다.

컴퓨터 시각 인식

발췌. 작은 이미지 나 이미지를 나타냅니다. 이미지에서 개체를 계산합니다 . 연결된 컴포넌트 레이블 알고리즘을 사용하여 각 오브젝트에 먼저 레이블을 지정한 다음 오브젝트를 계산합니다. O'Carroll 알고리즘. 곤충 비전의 수학적 변환에서이 알고리즘은 물체를 피하는 방법을 평가합니다.

유전자 알고리즘

그들은 세 개의 연산자를 사용합니다. 선택 (솔루션 선택), 복제 (선택된 솔루션을 사용하여 다른 솔루션 구성), 교체 (더 나은 경우 솔루션 교체).

체력 비례 선택. 룰렛 휠 선택이라고도하며 솔루션 선택에 사용되는 기능입니다. 잘림 선택. 피트니스별로 정렬 된 솔루션을 선택하는 또 다른 방법입니다. 토너먼트 선택. 토너먼트 종류에 따라 최상의 솔루션을 선택하십시오. 확률 적 범용 샘플링. 개인은 선의 연속적인 세그먼트에 매핑되어 각 개인의 세그먼트는 룰렛 휠 선택에서와 정확하게 일치하도록 크기가 동일합니다.

신경망

홉 필드 넷. 이진 임계 값 단위를 가진 컨텐츠 주소 지정 가능 메모리 시스템 역할을하는 반복적 인 인공 신경망. 그들은 안정적인 상태로 수렴합니다. 역 전파. 인공 신경망 훈련에 사용되는지도 학습 기법. 자가 조직도 (고호 넨지도). 신경 네트워크는 비지도 학습을 사용하여 훈련 샘플의 저 차원 (2D, 3D) 표현을 생성하도록 훈련되었습니다. 고차원 데이터를 시각화하는 데 좋습니다.

생물 정보학

Needleman-Wunsch. 단백질 또는 뉴클레오티드 서열에 대해 2 개의 서열에 대해 전체 정렬을 수행합니다. 스미스 워터맨 Needleman-Wunsch의 변형.

압축

무손실 압축 알고리즘

버로우즈 휠러 변환. 무손실 압축을 개선하는 데 유용한 전처리. 꺾다. ZIP이 사용하는 데이터 압축. 델타 인코딩. 순차적 데이터가 자주 발생하는 데이터 압축을 지원합니다. 증분 인코딩. 문자열 시퀀스에 델타 인코딩이 적용되었습니다. LZW. (Lempel-Ziv-Welch). LZ78의 후계자. 압축 할 데이터에서 변환 테이블을 작성합니다. GIF 그래픽 형식으로 사용됩니다. LZ77 및 78. 추가 LZ 변형 (LZW, LZSS 등)의 기초. 둘 다 사전 코더입니다. LZMA. Lempel-Ziv-Markov chain-Algorithm의 약어입니다. LZO. 속도에 중점을 둔 데이터 압축 알고리즘. PPM(부분 매칭에 의한 예측). 컨텍스트 모델링 및 예측에 기반한 적응 형 통계 데이터 압축 기술. Shannon-Fano 코딩. 일련의 기호 및 해당 확률을 기반으로 접두사 코드를 구성합니다. 잘린 이진. 유한 알파벳으로 균일 한 확률 분포에 일반적으로 사용되는 엔트로피 인코딩. 이진 인코딩을 향상시킵니다. 실행 길이 인코딩 동일한 코드 시퀀스를 발생 횟수로 대체하는 기본 압축. 후유증. 문자열에 대한 증분 문법 추론. EZW (임베디드 제로 트리 웨이블릿). 정확도를 높이면서 이미지를 비트 스트림으로 압축하는 프로그레시브 인코딩 더 나은 결과로 압축 손실이 발생할 수 있습니다.

엔트로피 인코딩 코드 길이를 심볼의 확률과 일치시키기 위해 코드에 심볼을 할당 하는 코딩 체계.

허프만 코딩. 상대적인 문자 주파수를 활용하는 간단한 무손실 압축. 적응 형 허프만 코딩. 허프만 코딩에 기초한 적응 적 코딩 기술. 산술 코딩. 고급 엔트로피 코딩. 범위 인코딩. 산술 코딩과 동일하지만 약간 다른 방식으로 살펴 보았습니다. 단항 코딩. n이 n 인 숫자 n과 그 뒤에 0을 나타내는 코드입니다. Elias 델타, 감마, 오메가 코딩. 양의 정수를 인코딩하는 범용 코드. 피보나치 코딩. 양의 정수를 이진 코드 워드로 인코딩하는 범용 코드. 골롬 코딩. 기하학적 분포에 따라 알파벳에 최적 인 엔트로피 코딩 형태. 쌀 코딩. 기하학적 분포에 따라 알파벳에 최적 인 엔트로피 코딩 형태.

손실 압축 알고리즘

선형 예측 코딩. 압축 된 형태로 디지털 음성 신호의 스펙트럼 엔벨로프를 표현함으로써 손실 압축. 법칙 알고리즘. 표준 컴 팬딩 알고리즘. Mu-law 알고리즘. 표준 아날로그 신호 압축 또는 컴 팬딩 알고리즘. 프랙탈 압축. 프랙탈을 사용하여 이미지를 압축하는 데 사용되는 방법입니다. 변환 코딩. 오디오 신호 또는 사진 이미지와 같은 데이터의 데이터 압축 유형. 벡터 양자화. 손실 데이터 압축에 자주 사용되는 기술입니다. 웨이블릿 압축. 이미지 및 오디오 압축에 적합한 데이터 압축 형식입니다.

암호화

비밀 키 (대칭 암호화)

암호 해독 및 암호화에 비밀 키 (또는 직접 관련된 키 쌍)를 사용하십시오.

Rijndael이라고도하는 AES (Advanced Encryption Standard) . 복어. Schneier가 노화 알고리즘을 대체하기 위해 범용 알고리즘으로 설계했습니다. DES (Data Encryption Standard) , 이전 DE 알고리즘. IDEA (International Data Encryption Algorithm) . DES를 대체 ​​한 이전의 IPES (개선 된 PES). PGP (Pretty Good Privacy)에서 사용합니다. 키를 사용하여 블록으로 분할 된 데이터에 대한 변환을 수행합니다. RC4 또는 ARC4. 인터넷 트래픽 용 SSL 및 무선 네트워크 용 WEP와 같은 프로토콜에서 널리 사용되는 스트림 암호. 작은 암호화 알고리즘. 일부 수식을 사용하여 블록 암호 알고리즘을 쉽게 구현할 수 있습니다. PES (제안 된 암호화 표준). IDEA의 이전 이름.

공개 키 (비대칭 암호화)

공개 키 및 개인 키로 지정된 키 쌍을 사용하십시오. 공개 키는 메시지를 암호화하며 개인 키만 메시지를 해독 할 수 있습니다.

DSA (Digital Signature Algorithm). 소수와 난수로 키를 생성하십시오. 미국 대행사에서 사용되었으며 현재는 공개 도메인입니다. 엘가 말. GNU Privacy Guard 소프트웨어, PGP 및 기타 암호화 시스템에서 사용하는 Diffie-Hellman을 기반으로합니다. RSA (Rivest, Shamir, Adleman). 전자 상거래 프로토콜에 널리 사용됩니다. 소수를 사용하십시오. Diffie-Hellman (Merkle) 키 교환 (또는 지수 키 교환). 보호되지 않은 통신 채널을 통해 비밀을 공유하는 방법 및 알고리즘 RSA에서 사용합니다. NTRUEncrypt. 컨볼 루션 곱셈으로 다항식 고리를 사용합니다.

메시지 요약 기능

메시지 다이제스트는 해시 함수에 의해 처리되는 임의 길이의 문자열 또는 데이터를 암호화 한 코드입니다.

MD5. CD 또는 DVD의 ISO 이미지를 확인하는 데 사용됩니다. RIPEMD (RACE Integrity Primitives 평가 메시지 다이제스트). MD4의 원칙을 기반으로하며 SHA-1과 유사합니다. SHA-1 (보안 해시 알고리즘 1). SHA 관련 암호화 해시 함수 집합에서 가장 일반적으로 사용됩니다. NSA 에이전시에 의해 설계되었습니다. HMAC. 키 해시 메시지 인증. 타이거 (TTH). 일반적으로 Tiger 트리 해시에 사용됩니다.

암호화 사용하여 의사 난수를 참조하십시오. 난수 생성기

암호화 기법

비밀 공유, 비밀 분할, 키 분할, M / N 알고리즘

샤미르의 비밀 공유 체계. 다항식 보간법에 기반한 공식입니다. Blakley의 비밀 공유 체계. 본질적으로 기하학적이며 비밀은 m 차원 공간의 요점입니다.

다른 기술과 암호 해독

부분 집합. 정수 세트가 주어지면 부분 집합의 합계가 0입니까? 암호화에 사용됩니다. 쇼어 알고리즘. RSA와 같은 비대칭 함수를 기반으로 코드를 해독 할 수있는 양자 알고리즘.

기하학

선물 포장. 일련의 점의 볼록 껍질 결정. 길버트 존슨 키어 티 거리. 두 볼록한 모양 사이의 최소 거리를 결정합니다. 그레이엄 스캔. 평면에서 일련의 점의 볼록 껍질 결정. 선분 교차. 선이 스윕 선 알고리즘과 교차하는지 확인 다각형을 가리 킵니다. 주어진 지점이 주어진 지점 내에 있는지 테스트합니다. 레이 / 평면 교차. * 선 / 삼각형 교차점 * 레이 / 평면 교차점의 특별한 경우. 암시 적 표면의 다각형 화. 다각형으로 대략적인 암시 적 표면. 삼각 분할.거리가 알려진 각도에서 다른 점까지의 거리를 평가하는 방법입니다.

3D 표면 추적기 기술 그래프 . 숨겨진 표면을 고려하면서 비디오의 벽에 이미지를 추가하는 프로세스입니다. 벨맨 포드. 가중치 그래프에서 가장 짧은 경로를 계산합니다 (가장자리 가중치 중 일부는 음수 일 수 있음). Dijkstra의 알고리즘. 음수가 아닌 모서리 가중치를 사용하여 그래프에서 최단 경로를 계산합니다. 섭동 방법. 그래프에서 로컬로 가장 짧은 경로를 계산하는 알고리즘입니다. 플로이드 워샬 가중, 방향 그래프로 모든 쌍의 최단 경로 문제를 해결합니다. 플로이드의 사이클 찾기. 반복주기를 찾습니다. 존슨 희소 가중 지향 그래프에서 모든 쌍의 최단 경로 알고리즘. 크루 칼.그래프의 최소 스패닝 트리를 찾습니다. 프라임 그래프의 최소 스패닝 트리를 찾습니다. DJP, Jarník 또는 Prim-Jarník 알고리즘이라고도합니다. * Boruvka. * 그래프의 최소 스패닝 트리를 찾습니다. 포드 풀 커슨 그래프에서 최대 흐름을 계산합니다. 에드몬드-카프 포드 풀 커슨의 구현. 비 차단 최소 스패닝 스위치. 전화 교환. 우드 하우스 샤프. 그래프의 최소 스패닝 트리를 찾습니다. 스프링 기반. 그래프 그리기 알고리즘. 헝가리 인. 완벽한 매칭을위한 알고리즘. 채색 알고리즘. 그래프 채색 알고리즘. 가장 가까운 이웃.가장 가까운 이웃을 찾으십시오. 토폴로지 정렬. 방향에 따라 모서리가있는 모든 노드 앞에 각 노드가 오도록 방향성 비순환 그래프를 정렬합니다. Tarjan의 오프라인 최소 공통 조상 알고리즘. 트리의 노드 쌍에 대해 가장 낮은 공통 조상을 계산합니다.

제도법

브레 젠햄 라인 알고리즘. 결정 변수를 사용하여 지정된 두 점 사이에 직선을 그립니다. 풍경 3D 풍경을 그립니다. * DDA 선 알고리즘. * 부동 소수점 연산을 사용하여 지정된 두 점 사이에 직선을 그립니다. 홍수 채우기. 연결된 영역을 색으로 채 웁니다. 이미지 복원. 사진을 복원하고 이미지를 개선하십시오. Xiaolin Wu의 라인 알고리즘. 앤티 앨리어싱 화가의 알고리즘. 3 차원 풍경에서 보이는 부분을 감지합니다. 광선 추적. 현실적인 이미지 렌더링. 퐁 쉐이딩. 3D 컴퓨터 그래픽의 조명 모델 및 보간 방법. Gouraud 음영.3D 객체 표면에서 빛과 색상의 다양한 효과를 시뮬레이션합니다. 스캔 라인 렌더링. 허 수선을 움직여 이미지를 구성합니다. 글로벌 일루미네이션. 다른 물체로부터의 직접 조명 및 반사를 고려합니다. 보간. 디지털 줌과 같은 새로운 데이터 포인트 구성. 재 합성기. 사진에서 개체를 제거하고 Photoshop 및 The Gimp에서 사용하는 배경을 다시 작성하십시오. 신디사이저 자습서. 슬로프 인터셉트 알고리즘. 선을 그리기위한 기울기-절편 공식의 구현입니다. 스플라인 보간. Runge 현상으로 인한 오류를 줄입니다. 3D 표면 추적기 기술. 비데오의 벽에 이미지 또는 비데오 추가, 숨겨진 표면이 고려됩니다.

리스트, 배열 및 트리

수색

사전 검색. 예측 검색을 참조하십시오. 선택 알고리즘. 목록에서 k 번째로 큰 항목을 찾습니다. 이진 검색 알고리즘. 정렬 된 목록에서 항목을 찾습니다. 너비 우선 검색. 레벨별로 그래프 레벨을 이동합니다. 깊이 우선 검색. 분기별로 그래프 분기를 통과합니다. 최고의 검색. 우선 순위 대기열을 사용하여 중요한 순서대로 그래프를 이동합니다. 트리를 검색합니다. * 사용 휴리스틱 속도를 개선하는 것이 가장 우선 탐색의 특별 케이스. 균일 한 비용 검색. 비용이 다양한 최저 비용 경로를 찾는 트리 검색. 예측 검색.검색어의 크기와 검색에서 높고 낮은 값을 고려하는 검색과 같은 이진입니다. 해시 테이블. 정렬되지 않은 컬렉션의 항목에 키를 연결하여 선형 시간에 검색합니다. 보간 된 검색. 예측 검색을 참조하십시오.

정렬

이진 트리 정렬. 삽입 정렬과 유사한 이진 트리의 정렬입니다. 보고 소트. 책상 카드의 비효율적 인 임의 종류. 버블 정렬. 각 인덱스 쌍에 대해 순서가 맞지 않으면 항목을 교체하십시오. 버킷 정렬. 버킷으로 목록을 분할하고 개별적으로 정렬하십시오. 비둘기 구멍 정렬을 일반화합니다. 칵테일 종류 (또는 양방향 버블, 셰이커, 리플, 셔틀, 해피 아워 정렬). 양방향으로 정렬되는 버블 정렬의 변형은 각각 목록을 통과합니다. 빗 정렬. 목록의 끝 부분에있는 작은 값인 "거북이"를 제거하고 12 개의 값 사이의 간격을 사용하는 기포 정렬의 효율적인 변형입니다. 카운팅 정렬.리스트 A의 숫자 범위를 사용하여이 길이의 배열 B를 작성합니다. B의 인덱스는 A보다 i보다 작은 값을 가진 요소 수를 계산하는 데 사용됩니다. 그놈 정렬. 버블 정렬에서와 같이 요소를 적절한 위치로 이동시키는 것은 일련의 스왑에 의해 수행된다는 점을 제외하고는 삽입 정렬과 유사합니다. 힙 정렬. 목록을 힙으로 변환하고 힙에서 가장 큰 요소를 계속 제거하고 목록 끝에 추가하십시오. 삽입 정렬. 정렬 된 항목 목록에서 현재 항목이 속하는 위치를 결정한 후 삽입하십시오. 소개. 또는 내성적 인 종류. 빠른 정렬에서 시작하여 특정 재귀 수준에서 힙 정렬로 전환합니다. 정렬을 병합하십시오.목록의 전반과 후반을 개별적으로 정렬 한 다음 정렬 된 목록을 병합하십시오. 팬케이크 종류. 시퀀스의 일부 접두사의 요소를 반전시킵니다. 비둘기 구멍 종류. 정렬 할 배열의 모든 요소로 빈 배열을 순서대로 채 웁니다. 우편 배달부 정렬. 우체국에서 사용하는 계층 적 버킷 정렬. 퀵 정렬. 목록을 두 개로 나누십시오. 첫 번째 목록의 모든 항목이 두 번째 목록의 모든 항목 앞에옵니다.; 그런 다음 두 목록을 정렬하십시오. 종종 선택 방법. 기수 정렬. 숫자를 처리하여 항목 또는 정수와 관련된 키를 정렬합니다. 선택 정렬 나머지 요소 중 가장 작은 요소를 선택하여 정렬 된 목록의 끝에 추가하십시오. 쉘 정렬.값 사이의 간격을 사용하여 삽입 정렬을 향상시킵니다. 스무스 정렬. heapsort를 참조하십시오. 확률 론적 정렬. 보고 소트 참조.

그리고 더 많은...


0

질문 헤더에 두 가지 질문을 했으므로 두 가지에 모두 답변하겠습니다.

예, 컴퓨터 과학은 알고리즘에 관한 것입니다. 글쎄 ... 실제로 컴퓨터 과학에는 여러 가지 측면이 있기 때문에 약간 오해의 소지가 있으므로 다시 말하겠습니다. 작업 세계에 적용되는 컴퓨터 과학은 주로 알고리즘에 관한 것입니다. Google, Facebook 및 월스트리트에서 물리학 자 및 개발자를 고용하는 모든 미친 곳은 간단한 형태로 축소 된 복잡한 문제를 원하기 때문에 수학과 알고리즘 설계에 대한 깊은 이해가 필요합니다.

아니요, 프로그래밍은 알고리즘에 관한 것이 아닙니다. 프로그래밍은 사양을 가져 와서 실행을 위해 컴파일 할 수있는 코드로 변환하는 것입니다.

대답의 추가 부분 : 소프트웨어 개발은 ​​프로그래밍이 아니지만 많은 사람들이 용어를 혼동하고 상호 교환 적으로 사용하는 것 같습니다. 프로그래밍은 단순히 소프트웨어 개발의 더 큰 프로세스의 기능 또는 기술 일뿐입니다. 소프트웨어 개발은 ​​확실히 알고리즘에 관한 것이 아니라 소프트웨어로 문제를 해결하고 비즈니스와 호환되는 프로세스를 적용하여 문제를 효율적으로 해결하는 것입니다. 소프트웨어 개발 프로세스는 물론 프로그래밍 자체도 그 자체로는 알고리즘 프로세스 일 수 있지만 이는 알고리즘에 관한 것과는 다릅니다 .

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