데이터 구조 및 알고리즘 학습을위한 프로그래밍 언어 선택
프로그래밍 어떤 언어 당신은 추천 할 것입니다 배울 수 에 대한 데이터 구조와 알고리즘 에?
다음 사항을 고려하십시오.
- 개인적인 경험
- 언어 기능 (포인터, OO 등)
- DS & A 개념 학습에 적합
프로그래밍 언어에 구애받지 않는 (수학적 관점에서 작성하고 의사 코드를 사용하는) 책이 있기 때문에. 이 중 하나에서 배우면 알고리즘을 코딩하고 언어를 선택하고 싶습니다.
그런 다음 특정 프로그래밍 언어로 스피커 소개와 함께 DS & A 개념을 소개하는 알고리즘도 코딩하고 싶습니다. 따라서 어느 정도 언어도 책을 선택합니다.
어느 쪽이든, 나는 언어를 선택해야하며, 전체적으로 하나를 고수하는 것을 선호합니다. 개인 언어 기본 설정을 제쳐두고이 목적에 가장 생각하는 것은 무엇입니까?
이 질문에 대한 답은 정확히 무엇을 배우고 싶은지에 따라.
Python과 Ruby
Python 및 Ruby와 같은 고급 언어는 높은 수준이고 구문이 읽기 쉽기 때문에 종종 제안됩니다. 그러나 언어는 모두 공통 데이터 구조에 있습니다. 자신의 버전을 학습 연습으로 구현하는 것을 막을 수는 없지만 고수준 데이터 구조 위에 고수준 데이터 구조를 구축하고 것을 알 수 있습니다. 이것은 반드시 반드시 유용합니다.
또한 Ruby와 Python은 동적 형식의 언어입니다. 이 좋을 수 있고 많은 것이 스러울 수 있고 일반적으로 실행되지 않습니다.
씨
C는 다른 극단에 있습니다. 메모리 관리 방법과 같은 매우 낮은 수준의 세부 정보를 배우고 싶은 경우 좋지만 메모리 관리는 malloc () / free ()의 올바른 사용과 같이 갑자기 중요한 고려 사항입니다. 그것은 산만 할 수 있습니다. 또한 C는 객체 지향이 아닙니다. 그것은 나쁜 것입니다.
C ++
C ++이 언급되었습니다. 댓글에서 말했듯이이 끔찍한 선택 이라고 생각합니다 . C ++는 단순한 사용법 엄청나게 복잡하고 우스꽝스러운 양의 "잡동사니"가 있습니다. 또한 C ++에는 공통 기본 클래스가 없습니다. 이것은 공통 기본 클래스에 의존하기 때문에 중요합니다. 명목상의 기본 클래스에 대한 버전을 구현할 수는 약간 덜 유용합니다.
자바
자바도 언급되었습니다. 많은 사람들이 자바를 싫어하고 언어가 매우 장황하고 더 현대적인 언어 기능 (예 : 클로저)이 부족하다는 것은 사실이지만 그 어느 것도 중요하지 않습니다. Java는 정적으로 유형이 지정되고 가비지 콜렉션이 있습니다. 즉, Java 컴파일러는 동적으로 입력 된 언어 (런타임까지)가 수행하지 않는 많은 오류를 처리하고 세분화 오류를 처리하지 않습니다 (Java에서 메모리 누수를 처리하지 않습니다. 당연히 가능합니다). Java가 좋은 선택이라고 생각합니다.
씨 #
C # 언어 는 최신 버전의 Java와 가변적입니다. Java와 가상 머신에서 실행되는 관리 (가비지 수집) 중간 언어입니다. C / C ++를 제외하고 여기에없는 모든 언어도 가상 머신에서 실행 Python, Ruby 등은 바이트 코드로 실행되지 않고 직접 해석됩니다.
C #은 기본적으로 Java와 동일한 장단점을 가지고 있습니다.
Haskell (기타)
마지막으로 Haskell, OCaml, Scheme / Lisp, Clojure, F # 함수 적 언어가 있습니다. 어느 시점에서 어떤 시점에서 배울 가치가 다시 배우고 싶은 것이 매우 다른 방식으로 생각하고 있습니다. 함수형 프로그래밍 또는 데이터 구조? 나는 문제를 혼동하기보다는 한 번에 한 가지만 배우는 것을 고수 할 것입니다. 어느 시점에서 기능적 언어를 배우는 경우 (내가 권장하는) Haskell은 안전하고 훌륭한 선택입니다.
내 충고
Java 또는 C #을 선택합니다. 둘 다 코드 작성 및 실행을 간단하게 만들어주는 훌륭한 무료 IDE (Eclipse, Netbeans 및 Java 용 IntelliJ Community Edition, C # 용 Visual Studio Express, Visual Studio Community Edition)를 제공합니다. 배열 복잡한 기본 데이터 구조와 직접 설치하는 것보다 메모리가없는 경우 기본적으로 C / C ++에서 사용하는 것이 필요하지 않습니다.
설명하겠습니다. 충분한 요소가 추가되면 확장 가능한 해시 테이블의 크기를 조정해야합니다. 어떤 구현에서든 백업 데이터 구조 (일반적으로 배열)의 크기를 두 배로 늘리고 기존 요소를 복사하는 것과 같은 작업을 수행해야합니다. 구현은 기본적으로 모든 명령형 언어에서 동일하지만 C / C ++에서는 할당하거나 할당 해제하지 않을 때 세분화 오류를 처리해야합니다.
동적 타이핑이 처음에는 문제가 될 수 있기 때문에 Python 또는 Ruby (어떤 것이 중요하지 않음) 발생가 다음 선택이 될 것입니다 (다른 두 가지에 매우 가깝습니다).
Java
주로 다음과 같은 추천 합니다 .
- 쓰레기 수거
- 참조
- 풍부한 컬렉션
편집 : 아래로 유권자는 설명하십시오.
제 생각에는 C가 데이터 구조와 알고리즘을 배우는 데 가장 좋은 언어가 될 것입니다. 포인터, 동적 메모리 할당 및 연결 목록, 해시 테이블 등록 같은 인기있는 데이터 구조의 구현을 이해하도록 강요합니다.이 중 상당수는 상위 수준 언어 (Java, C # 등)에서 당연한을 받아 들일 수 있습니다. ).
Python
중대하다. 모든 기능을 제어 할 수 있습니다. 코드로 작업하려는 경우 Python은 매우 익숙한 의사 보일 것입니다.
Python은 이미 UC Irvine 에서 선택한 알고리즘 언어 이며 다음과 같이되어 있습니다.
" Python은에 절실히 필요했던 알고리즘 지향 언어를 나타냅니다 교육. Python의 장점은 실험을 장려하는 교과서와 같은 구문과 상호 작용을 포함합니다. "
Python은 그래프 작성 인 Gato 를 사용하여 도구 에게만 한 방식으로 작동합니다 . 하나이며 Gato를 사용하면 복잡한 그래프 라이브러리를 배우지 쉽게 할 수 있습니다.
목적이 데이터 구조 와 알고리즘 에 알고리즘 배우는 것이라면 JavaScript라고 말하고 싶습니다. 브라우저에서 코드를 사용할 수 있습니다. 당신은 매우 유연한 객체 핸들링을 가지고 있고, 당신이 배우고있는 실제 컴퓨터 과학에서 점점 멀어지게 할 메모리 관리, 언어 구조 또는 다른 것들이 집중할 수있는 데이터 구조와 알고리즘에만 집중할 수 있습니다.
또한 브라우저를 사용하여 DOM 및 캔버스를 사용하여 그래프와 트리를 다양하게 데이터 구조를 쉽게 사용할 수 있습니다.
수년에 CS 문제는 학습을 용이하게하는 새롭고 더 나은 언어 구현이 있기 때문에 실제에 더 쉽게 집중할 수 있기 때문에 수업이 언어를 변경하는 경향이 있습니다.
Oberon-2 또는 Component Pascal . 마지막 항목은 첫 번째 항목의 상위 집합입니다.
아인슈타인 은 "심각하게 한 간단하게 만드십시오."라고라고. 이 문구는 Niklaus Wirth 교수가 원래 Oberon 언어 보고서의 서문으로 선택했습니다. 그리고 언급 된 한 Oberon의 후손도 마찬가지입니다.
프로그래밍 언어의 완벽성에 저는 Antoine de Saint-Exupéry를 인용합니다. "디자이너는 더 이상 추가 할 필요가 없을 때가 아니라 더 이상 제거 할 필요가 없을 때 완벽에 도달 할 것을 알고 있습니다." . Wirth는 이것을 달성하지 못하더라도 올바른 길을 가고 있습니다. "Wirth programming languages line"(Algol-> Pascal-> Modula-2-> Oberon-> Oberon-2)에서 각 언어는 이전 언어보다 더 간단하고 더 강력합니다.
최소한의 놀라움의 원칙을 따르는 강력하지만 단순한 언어 . 강력한 정적 타이핑, 쉬운 객체 지향 기능, 가비지 콜렉션. 기능 목록은 크지는 않지만 생산적이면서 특히 초기 단계에서 일을 복잡하게하지 않습니다.
알고리즘과 데이터 구조를 배우고 콘텐츠를 의미합니다. 그러나 그러나 언어가 "강력하다"면 (C ++, C #, Java, Python 같은 많은 기능이 있음) 알고리즘과 데이터 구조가 아닌 언어 학습에 많은 시간을 사용할 수 있습니다. 당신은 나무에 대한 숲을 볼 수 없습니다. =) 트리를 구문 요소 (및 기타 기능)로, 중요한 개념 (모든 알고리즘, 데이터 구조, OOP 등)으로 생각할 수 있습니다. (트리)이 많을수록 뒤로 물러나서 개념을 이해하는 작업 (숲을보기 위해)이 더 복잡해
그러나 언어 자체가 정말 그렇습니다. 나무가 너무 많지 않아서 몇 걸음 뒤로 물러날 수 있습니다. 그게 충분한 비유라고 생각합니다. =)
또한 알고리즘 및 데이터 구조에 대한 많은 책 은 Algol / Pascal과 유사한 의사 코드를 사용하며이 언어로 예제를 쉽게 변환 할 수 있습니다. 그리고 Wirth의 "알고리즘 및 데이터 구조"책의 예제를 직접 사용할 수 있습니다. Oberon 에디션 (2004), PDF (1.2MB).
추가 링크 :
- Linux, Windows, Mac OS X 용 Oxford Oberon-2 컴파일러.
- BlackBox Component Builder -Component Pascal 용 개발 환경. Windows 전용. Wine에서 아주 잘 작동합니다.
- 알고리즘에 대한 제가 가장 좋아하는 책인 Anany V. Levitin의 알고리즘 설계 및 분석 소개 .
나는 Ada를 제안 할 것이다. 범위 검사와 같이 다른 언어에서 찾을 수없는 데이터 구조를위한 기능 type Day is range 1 .. 31;
도 있습니다. 또한 매우 엄격한 컴파일 타임 및 런타임 검사 (끄기로 선택하지 않는 한)가있어 구현에서 버그를 쉽게 찾을 수 있습니다.
저항이 가장 적은 길을 가고 싶다면 Python. 불필요한 보일러 플레이트 등의 양은 최소화됩니다.
이상적으로는 C로 알고리즘을 배우고 싶습니다. 그래서 여러분은 메모리 수준에서 무슨 일이 일어나는지 배울 수 있습니다. 또한 기능적 언어로 알고리즘을 배우고 싶으므로 유사한 알고리즘이 영구 데이터 구조와 어떻게 작동하는지 확인할 수 있습니다.
Knuth의 유명한 책 에는 많은 양의 (발명 된 플랫폼) 어셈블러 코드가 포함되어 있습니다. 슈퍼 하드 코어가되고 싶다면이 방법을 권장합니다. 하지만 개인적으로 알고리즘 수업을 진행할 때 C에서 일했습니다 (공개 : 불과 몇 년 전이었습니다). 나는 때때로 Knuth에서 몇 가지 문제를 해결하고 있지만, 알고리즘 학습을 위해 선택한 언어로 MMIX를 전적으로 사용할지 모르겠습니다. 약간 과잉이라고 느낄 것입니다.
편집 : 그것은 또한 당신이 익숙한 것에 달려 있습니다. 지금 당장 알고리즘 텍스트를 통해 작업을 시작하고 C로 많은 작업을 해본 적이 없다면 Python이 정답입니다. 당신은 이것을 즐기고 싶기 때문에 언어가 극복하기에 큰 장애물이되지 않기를 원합니다. 나도 알아.
마지막 요점 : 적어도 제가 알고리즘을 배우고있을 때, 저는 종이 작업에 엄청난 시간을 보냈습니다. 나는 그것이 중요하다고 생각합니다. 무증상 등에 대해 배우고 싶다는 뜻입니다. 어떤 언어로든 알고리즘을 구현하는 데 모든 시간을 할애하는 것은 할 일이 아닙니다.
Lisp가 살펴볼 가치가 있다고 생각합니다.
나의 첫 번째 대학 프로그래밍 과정은 Lisp에있었습니다. 그 전에는 10 년 동안 여러 언어로 프로그램을 작성했습니다. 첫 번째 프로그래밍 과정이 지루할 거라고 생각했지만 틀 렸습니다.
Lisp는 구문이 매우 간단하기 때문에 매우 흥미로운 언어입니다. 초점은 구문에서 기능으로 이동합니다. 함수형 프로그래밍 스타일은 또한 배우기에 매우 가치있는 것입니다. Lisp 과정을 마친 후 Lisp가 가르쳐 준 새로운 개념 덕분에 완전히 새롭고 더 나은 방식으로 C ++로 프로그램을 작성했습니다.
Lisp는 또한 코드와 데이터에 대해 동일한 표현을 사용하므로 코드를 즉석에서 생성 한 다음 실행하는 흥미로운 알고리즘 설계가 열립니다.
"당신의 유일한 도구가 망치라면 당신의 모든 문제는 못처럼 보일 것입니다."
최소한 몇 가지 언어를 배우십시오.
또한 선택은 목적에 따라 다릅니다.
취미? Windows 세계에서 일하십니까? Linux / UNIX 제품군?
응용 프로그램 유형 : 비즈니스 대 과학; 하드웨어 드라이버 또는 응용 프로그램?
데스크탑 애플리케이션 또는 웹 애플리케이션?
몇 가지 제안이 있습니다.
(a) J (jsoftware.com에서 무료, APL의 후계자, J와 APL 모두 Turing 우승자 인 Ken Iverson의 창작물입니다. Turing상은 컴퓨팅 분야의 노벨상과 같습니다)을 확실히 배웁니다.
(b) Windows 세계에 있다면 .NET의 많은 부분이 c #에서 실행되기 때문에 c #으로 시작하십시오. 가능하다면 Microsoft Press에서 Tom Archer의 "Inside c #"사본을 받으십시오. Microsoft의 익스프레스 버전을 다운로드하여 무료 C # 개발 시스템을 얻을 수 있습니다.
(c) TDD / BDD 사용법 배우기 ... 언어에 관계없이 먼저 단위 테스트라고하는 작은 테스트를 작성합니다. 다음으로 단위 테스트를 통과하는 프로덕션 코드를 작성합니다. 한 번에 한 단계 씩 ... 사용하는 언어뿐 아니라 방법론이기도합니다.
(d) 어셈블러 언어 배우기 ... 어셈블러는 저수준이고 거의 기계어이므로이면에서 일어나는 일을 잘 이해할 수 있습니다.
(e) Windows 외부에서는 C ++를 권장합니다.
최고의 언어는 없습니다.
언어에 관한 것이라면 프로그래밍이 더 쉬울 것입니다.
매우 구체적인 알고리즘을 배우고 싶을뿐만 아니라 더 일반적인 패턴을 배우고 싶고 주어진 문제를 해결하기위한 접근 방식을 선택하는 데 도움이 될 수 있습니다.
한 가지는 확실합니다. 프로그래머가 되려고한다면 배울 것이 부족하지 않을 것입니다.
표준 ML, OCaml, F # 또는 Haskell과 같은 대수 데이터 유형 및 패턴 일치를 사용하는 언어를 좋아할 것입니다. 예를 들어, 다음은 OCaml / F #으로 작성된 빨강-검정 이진 검색 트리를 재조정하는 함수입니다.
let balance = function
| R(R(a, x, b), y, c), z, d | R(a, x, R(b, y, c)), z, d
| a, x, R(R(b, y, c), z, d) | a, x, R(b, y, R(c, z, d)) ->
R(B(a, x, b), y, B(c, z, d))
| a, x, b -> B(a, x, b)
내가 틀렸을 수도 있지만 데이터 구조와 알고리즘이 프로그래밍 언어와 독립적이지 않습니까?
결국 데이터 구조는 데이터를 구성하는 방법 일뿐입니다. 모든 고급 언어가이를 지원합니다. 물론 특정 언어에는 기본 데이터 구조 (예 : Java 또는 C ++ STL의 Collections Framework)를 구현하는 메커니즘이 있지만 선택한 프로그래밍 언어로 데이터 구조를 프로그래밍하는 것을 막지는 않습니다. 또한 알고리즘은 의사 코드로 작성되어 언어 독립적입니다.
나는 그것이 당신의 질문에 실제로 답하지 않는다는 것을 알고 있지만, 당신이 찾고있는 것을 파악하는 데 어려움을 겪고 있습니다. 데이터 구조 / 알고리즘 학습 또는 새로운 언어 학습.
비정상적인 C ++를 제외한 모든 언어는 잘 작동합니다.
나는 C ++를 선호한다 :)
'ProgramingTip' 카테고리의 다른 글
오류 : 데이터 경로“.builders [ 'app-shell']”에는 필수 속성 'class'가 있어야합니다. (0) | 2020.10.25 |
---|---|
CodeIgniter로 MySQL 쿼리, 필드가 NULL 인 행 선택 (0) | 2020.10.25 |
텍스트를 자르는 Django 템플릿 태그 (0) | 2020.10.25 |
React Router에서 DefaultRoute를 다른 경로로 설정하는 방법 (0) | 2020.10.25 |
주어진 값이 일반 목록인지 어떻게 확인합니까? (0) | 2020.10.25 |