숫자 기반 시스템에 기반한 알고리즘? [닫은]


87

나는 최근에 창의적 기반에서 숫자의 영리한 사용을 부분적으로 또는 전체적으로 기반으로하는 수많은 알고리즘이 있다는 것을 알게되었습니다. 예를 들면 :

  • 이항 힙은 이진수를 기반으로하고 더 복잡한 스큐 이항 힙은 스큐 이진수를 기반으로합니다.
  • 사전 순으로 정렬 된 순열을 생성하는 일부 알고리즘은 팩 토라 딕 숫자 시스템을 기반으로합니다.
  • 시도는 적절한 기준에 대해 한 번에 문자열의 한 자리를 보는 트리로 생각할 수 있습니다.
  • Huffman 인코딩 트리는 트리의 각 에지가 일부 이진 표현에서 0 또는 1을 인코딩하도록 설계되었습니다.
  • 피보나치 코딩은 피보나치 검색에 사용되며 특정 유형의 로그를 반전하는 데 사용됩니다.

제 질문은 : 직관이나 증명의 핵심 단계로 영리한 숫자 체계를 사용하는 다른 알고리즘이 있습니까? . 나는 주제에 대한 강연을 모으는 것에 대해 생각하고있다. 그래서 더 많은 예를 얻어야할수록 좋다.


5
저도 질문을 좋아하는데 '정답'을 어떻게 선택합니까? 커뮤니티 위키 여야합니까?
vlad

14
이것은 커뮤니티 위키이어야합니다
BlueRaja-Danny Pflughoeft 2011 년

18
@close 투표자 : 알고리즘에 대한 질문이 SO에서 주제에서 벗어난 경우 여기에서 주제가 무엇인지 모르겠습니다. CSS에 대한 바보 같은 초보자 질문? "정규식 plzz를 haz 수 있습니까"? "plz email teh codez 4 mi hoemwok"?
MAK 2011 년

2
은하계에 대한 히치하이커 가이드 : 생명, 우주 및 모든 것에 대한 답은 무엇입니까? Deep Thought의 대답 : 42. 질문을 찾는 기계로서의 지구 : 9 x 6은 무엇입니까? 그리고 이것이 모든 것이 그렇게 엉망이 된 이유입니다. 티셔츠에 표시 : 9 (기본 13) x 6 (기본 13) = 42 (기본 13). QED.
Chris Walton

"직관이나 증명의 핵심 단계로 영리한 숫자 시스템을 사용하는 다른 알고리즘이 있습니까?" Stack Overflow 는 권장 사항 엔진 , 모든 항목의 목록 또는 링크 팜 이 아닙니다 . 절대적으로 실용적인 프로그래밍 문제를 해결하기위한 알고리즘. 영리한 알고리즘을위한 정보 센터, 아니요. 그들이 이것을 원한다면 Mathematics '메타 에 대해 물어볼 수 있습니다 .

답변:


39

Chris Okasaki는 그의 저서 Purely Functional Data Structures 에서 "Numerical Representations"에 대해 아주 좋은 장을 가지고 있습니다. 본질적으로 숫자의 일부 표현을 취하여 데이터 구조로 변환합니다. 풍미를 제공하기 위해 해당 장의 섹션은 다음과 같습니다.

  1. 위치 번호 체계
  2. 이진 숫자 (이진 랜덤 액세스 목록, 제로리스 표현, 게으른 표현, 세그먼트 표현)
  3. 이진 숫자 기울이기 (이진 임의 액세스 목록 기울이기, 이항 힙 기울이기)
  4. 삼진 및 사진 숫자

몇 가지 최고의 트릭은 다음과 같습니다.

  • 구별 밀도스파 스 (일반적으로이 행렬 또는 그래프에서 볼하지만 너무 숫자에 적용 할 수있어!) 숫자의 표현
  • 중복 번호 체계 (숫자를 두 개 이상 표시하는 시스템)가 유용합니다.
  • 첫 번째 숫자를 0이 아니도록 배열하거나 0이없는 표현을 사용하면 데이터 구조의 헤드를 검색하는 것이 효율적일 수 있습니다.
  • 데이터 구조 를 세분화 하여 계단식 차용 (목록의 끝 부분을 가져옴) 및 전달 (목록에 대한 고려에서)을 피하십시오.

다음은 해당 장에 대한 참조 목록입니다.

  • Guibas, McCreight, Plass 및 Roberts : 선형 목록에 대한 새로운 표현.
  • Myers : 적용 가능한 랜덤 액세스 스택
  • Carlsson, Munro, Poblete : 삽입 시간이 일정한 암시 적 이항 대기열.
  • Kaplan, Tarjan : 순전히 기능적 목록이며 재귀 적 속도 저하를 통해 연결됩니다.

2
+1 저는 오카 사키의 책을 가지고 있습니다 ... 저는 그 장을 좋아했고 부분적으로 제가이 질문을 한 이유이기도합니다. (부트 스트랩 된 왜곡 된 이항 힙은 정말 멋집니다!) 그래도 끝까지 읽지는 않았습니다. 아마도 내가해야 할 것입니다. 또한 해당 참조를 확인합니다. 그들은 멋져 보입니다.
templatetypedef

Okasaky의 전체 논문은 온라인에서 볼 수 있습니다 : cs.cmu.edu/~rwh/theses/okasaki.pdf
Gigi

20

"삼진 숫자는 Sierpinski Triangle이나 Cantor 세트와 같은 자기 유사 구조를 편리하게 전달하는 데 사용할 수 있습니다." 출처

"2D 힐베르트 곡선의 표현에는 4 진수가 사용됩니다." 출처

"쿼터-허수 시스템은 1955 년 Donald Knuth가 고등학교 과학 재능 검색에 제출하여 처음 제안했습니다. 허수 2i를 기본으로 사용하는 비표준 위치 숫자 시스템입니다. 숫자 0, 1, 2, 3 만 사용하여 모든 복소수를 나타냅니다. " 출처

"로마 숫자는 이분법입니다." 출처

"Senary는 소수 연구에서 유용한 것으로 간주 될 수 있습니다. 2와 3을 제외한 모든 소수는 1 또는 5를 마지막 숫자로 갖기 때문입니다." 출처

"Sexagesimal (기본 60)은 60을 기본으로하는 숫자 체계입니다. 기원전 3 천년에 고대 수메르 인에서 시작되었으며 고대 바빌로니아 인에게 전 해졌고 여전히 수정 된 형태로 측정에 사용됩니다. 각도 인 시간, 각도, 지리적 좌표. " 출처

기타...

이 목록 은 좋은 출발점입니다.


6
이들 중 어느 것도 알고리즘과 관련되지 ..
BlueRaja - 대니 Pflughoeft을

11
물론입니다. 삼항으로 Sierpinski 삼각형 삼각형을 만들거나 60 진수로 지리 좌표를 계산합니다. 로마 숫자를 십진수로 변환하는 알고리즘은 어떻습니까? senary 시스템에 기반한 소수 찾기 알고리즘은 어떻습니까?
Benjamin

9

지난번에 귀하의 질문을 읽었으며 오늘 문제에 직면했습니다. 집합의 모든 분할을 어떻게 생성합니까? 나에게 발생한 해결책과 내가 사용한 (아마도 귀하의 질문을 읽었 기 때문에) 다음과 같습니다.

(p) 파티션이 필요한 (n) 요소가있는 집합의 경우 기본 (p)의 모든 (n) 자리 숫자를 세어보세요.

각 숫자는 분할에 해당합니다. 각 숫자는 세트의 요소에 해당하며 숫자 값은 요소를 넣을 파티션을 알려줍니다.

놀랍지는 않지만 깔끔합니다. 완전하고 중복이 발생하지 않으며 임의의 기반을 사용합니다. 사용하는 기준은 특정 파티션 문제에 따라 다릅니다.


3
나는 이것이 templatetypedef의 게시물에서 완전히 훔친 것이라고 생각하며 내 잠재 의식에 갇혀 있어야합니다. 바이너리보다 더 많은 염기에 대해 이야기하기 때문에 나는 그것을 떠났습니다.
Ben Horner 2011 년

2
이는 최대 p 개의 파티션으로 모든 파티션을 생성하며 중복성이 있습니다. 와 어떻게 111222구별 222111됩니까?
Null 설정

7

저는 최근에 0과 2n -1 사이의 숫자에 대한 이진 표현을 기반으로 사전 식 순서로 하위 집합을 생성하는 멋진 알고리즘을 발견했습니다.이 알고리즘 은 숫자 비트를 사용하여 집합에 대해 선택해야하는 요소를 결정하고 로컬로 재정렬해야합니다. 사전 순서로 가져 오기 위해 생성 된 세트. 궁금하다면 여기에 글을 게시 했습니다 .

또한 많은 알고리즘이 스케일링 (예 : Ford-Fulkerson max-flow 알고리즘의 약한 다항식 버전)을 기반으로하며, 입력 문제에서 숫자의 이진 표현을 사용하여 대략적인 근사를 완전한 솔루션으로 점진적으로 정제합니다.


2
이것은 서브 세트를 생성하는 가장 간단한 방법입니다. :)
st0le

이것은 조합 개념에서 가장 간단한 계산 방법입니다.
Saeed Amiri 2011

@ st0le- 비트와 세트 포함 사이의 일대일 매핑에서 얻는 정상적인 순서가 아니라 사전 순으로 세트를 나열하기 때문에 표준 버전보다 약간 까다 롭다고 생각합니다.
templatetypedef


6

매트릭스 곱셈의 속도를 높이기 위해 이중 기본 시스템에 대해 모호하게 기억합니다.

이중베이스 시스템은 하나의 번호에 두 개의베이스를 사용하는 중복 시스템입니다.

 n = Sum(i=1 --> l){ c_i * 2^{a_i} * 3 ^ {b_i}, where c in {-1,1}

중복은 하나의 숫자를 여러 방법으로 지정할 수 있음을 의미합니다.

Todor Cooklev의 Vassil Dimitrov의 "행렬 다항식 계산을위한 하이브리드 알고리즘"기사를 찾을 수 있습니다.

내가 할 수있는 가장 짧은 개요를 제공하려고합니다.

그들은 행렬 다항식을 계산하려고했습니다 G(N,A) = I + A + ... + A^{N-1}.

Supoosing N은 복합 G(N,A) = G(J,A) * G(K, A^J)이며 J = 2를 신청하면 다음을 얻습니다.

         / (I + A) * G(K, A^2)        , if N = 2K
G(N,A) = |
         \ I + (A + A^2) * G(K, A^2)  , if N = 2K + 1

또한,

         / (I + A + A^2) * G(K, A^3)           , if N = 3K
G(N,A) = | I + (A + A^2 + A^3) * G(K, A^3)     , if N = 3K + 1
         \ I + A * (A + A^2 + A^3) * G(K, A^3) , if N = 3K + 2

이러한 방정식 중 일부는 첫 번째 시스템에서 빠르고 일부는 두 번째 시스템에서 더 낫다는 것이 "분명한"(농담으로)이므로에 따라 가장 좋은 것을 선택하는 것이 좋습니다 N. 그러나 이것은 2와 3 모두에 대해 빠른 모듈로 연산이 필요합니다. 이중베이스가 들어오는 이유는 다음과 같습니다. 기본적으로 둘 다에 대해 모듈로 연산을 빠르게 수행하여 결합 된 시스템을 제공 할 수 있습니다.

         / (I + A + A^2) * G(K, A^3)       , if N = 0 or 3 mod 6
G(N,A) = | I + (A + A^2 + A^3) * G(K, A^3) , if N = 1 or 4 mod 6
         | (I + A) * G(3K + 1, A^2)        , if N = 2 mod 6
         \ I + (A + A^2) * G(3K + 2, A^2)  , if N = 5 mod 6

나는이 분야의 전문가가 아니기 때문에 더 나은 설명을 위해 기사를보십시오.



5

다음은 삼항 숫자를 사용하여 "위조 동전"문제를 해결하는 방법에 대한 좋은 게시물 입니다 (가능한 한 적은 잔고를 사용하여 일반 동전 가방에서 단일 위조 동전을 감지해야하는 경우).


이것은 굉장한 게시물이었고 결국 "Fun with Number Systems"라는 강연에서 이것을 사용하게되었습니다. 게시 해 주셔서 감사합니다!
templatetypedef

환영합니다. 사용할 수있게되어 기쁩니다!
Martin DeMello 2011 년

5

해싱 문자열 (예 : Rabin-Karp 알고리즘에서)은 종종 문자열을 n 자리 숫자로 구성된 base-b 숫자로 평가합니다 (여기서 n은 문자열의 길이이고 b는 충분히 큰 일부 선택된 기본입니다). 예를 들어 문자열 "ABCD"는 다음과 같이 해시 될 수 있습니다.

'A'*b^3+'B'*b^2+'C'*b^1+'D'*b^0

ASCII 값을 문자로 대체하고 b를 256으로하면 다음과 같이됩니다.

65*256^3+66*256^2+67*256^1+68*256^0

그러나 대부분의 실제 응용 프로그램에서 결과 값은 결과를 충분히 작게 유지하기 위해 합당한 크기의 숫자를 모듈로 가져옵니다.



4

Hackers Delight (모든 프로그래머가 내 눈에 알아야 할 책) 대한 unusal 기지에 대한 완전한 장에서는이 같은 -2 거점으로 (네, 바로 부정적인 기지) -1 + I (나는 같은 허수 단위의 SQRT (-1)) 등 베이스. 또한 가장 좋은 기준이 무엇인지 좋은 계산을합니다 (하드웨어 설계 측면에서 읽고 싶지 않은 모든 사람들을 위해 : 방정식의 해는 e이므로 2 또는 3으로 갈 수 있으므로 3이 조금 더 나을 것입니다 (요인 2)보다 1.056 배 우수하지만 기술적으로 더 실용적 임).

내 마음에 떠오르는 다른 것들은 회색 카운터 (이 시스템에서 1 비트 만 변경하면 하드웨어 설계에서 준 안정성 문제를 줄이기 위해이 속성을 자주 사용함) 또는 이미 언급 한 Huffmann 인코딩의 일반화 인 산술 인코딩입니다.


3

암호화는 정수 링 (모듈 식 산술)과 유한 필드를 광범위하게 사용하며, 그 연산은 정수 계수가있는 다항식이 작동하는 방식을 직관적으로 기반으로합니다.



1

좋은 질문입니다. 목록은 실제로 길다. 말하는 시간은 혼합 염기의 단순한 예입니다 (일 | 시간 | 분 | 초 | 오전 / 오후).

관심이 있으시면 메타베이스 열거 형 n- 튜플 프레임 워크를 만들었습니다. 기본 번호 체계를위한 매우 달콤한 구문 설탕입니다. 아직 출시되지 않았습니다. 내 사용자 이름을 이메일로 보냅니다 (gmail에서).


1
그리고 모든 달력 시스템-마야, 음력, 바빌로니아 .... 1971 년 이전의 영어 통화 (LSD). 당신이 말했듯이 목록은 계속됩니다.
Chris Walton

1

base 2를 사용하는 내가 가장 좋아하는 것 중 하나는 Arithmetic Encoding 입니다. 알고리즘의 하트가 이진법으로 0과 1 사이의 숫자 표현을 사용하기 때문에 특이합니다.


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