레이블이 Dijkstra인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Dijkstra인 게시물을 표시합니다. 모든 게시물 표시

프로그래밍 언어는 숫자를 왜 0 부터 시작해야 될까?

프로그래밍 언어는 숫자를 왜 0 부터 시작해야 될까?

처음 프로그래밍을 접한게 GW-BASIC 과 C 인 나로서는 숫자가 0부터 시작하는게 당연한줄 알았는데 FORTRAN 등은 옛날 프로그래밍은 1부터 시작을 했다고 한다.

숫자를 0 부터 시작해야 한다고 말한 사람은 최단경로 알고리즘과, 세마포어 연구로 유명한 네덜란드의 다익스트라(Dijkstra)다.

수열을 표현할때 다음과 같이하는것이 가장 자연스럽다.
하한(2) 상한(13)

2 <= i < 13

이렇게 사용하는것이 13 - 2 = 11 로 수열의 길이를 쉽게 알 수 있다.
다음과 같은 인접한 수열을 표현한다고 했을때, i의 상한과 j의 하한이 같다(인접한다고 할 수 있다.)

2 <= i < 13 , 13 <= j < 20

하한은 < 로 표현한다면 a < 1 로 는 자연수가 될 수 없다.

상한은 <= 표현해 공집합을 나타낸다면 2 <= n <= 1 과 같이 아름답지 못하기 때문에 상한을 배제하는 < 로 표현하는것이 좋다.

뭐 이런 아름다운 수열 표현을 위해 하한은 포함하고 상한은 배제하는 방식을 사용한다.
그럼 하한은 포함하고 상한은 배제 방식을 사용한다고 했을때
N 개를 루프를 처리할때

1 <= i < N+1

보다는

0 <= i < N

이 +1 이 없어 깔끔하다

참고
https://www.cs.utexas.edu/users/EWD/transcriptions/EWD08xx/EWD831.html
https://fastbeautiful.tistory.com/3

하한은 포함하고 상한은 배제하는 방식이 golang 슬라이스나 python 배열 범위 지정이 딱 이런 형식이다.

[:3]  ->  0 <= i < 3  ->  0,1,2
[1:5]  ->  1 <= i < 5  -> 1,2,3,4

위 번역글에 보면 수학자가 0부터 세는 컴퓨터 프로그래머를 비난 했다고 하는데, 뭐 dijkstra 의 방식을 싫어하는 사람들도 있을거다. 솔직히 다른 방식을 사용하는 사람들도 개취로 존중해주고 싶은게 내 맘이다.(사실 현업에서 이런 약속이 있어야 훨씬 업무적으로 편해서 왠만해선 합의하게 되지만) 다행히 난 dijkstra 의 방식이 참 맘에 든다.

암튼 dijkstra 보니 c 언어 할아버지 dennis ritchie 가 그립지만 또 한명의 c 언어 할아버지 ken thompson 이 go 를 만들어줘서 다행이다.

참고로 공대만화에도 다익스트라와 0의 이야기가 나온다.ㅎ
https://www.facebook.com/engineertoon/posts/1002506639936191

Algorithm

# sorting 구현
https://github.com/ysoftman/test_code/blob/master/cpp/sort_test.cpp

# GCD GCD(greatest common divisor) 최대 공약수 구하기

# binary search

# primer number 찾기

# prime number 찾기(Eratosthenes(에라토스테네스의 체) 방법으로 소수 구하기)

# 무한소수 체크

# Levenshtein-Distance 알고리즘 구현

# K-Means Clustering

# Dijkstra (다익스트라) 알고리즘으로 최단경로 찾기

# precision/recall

# elo rating

# anagram

# largest possible combined number
https://github.com/ysoftman/test_code/blob/master/golang/largest_possible_combined_number/largest_possible_combined_number.go

# codility_demo_find_equilibrium_index