Các thuật toán dựa trên hệ cơ số? [đóng cửa]


87

Gần đây, tôi đã nhận thấy rằng có rất nhiều thuật toán dựa trên một phần hoặc toàn bộ dựa trên việc sử dụng thông minh các con số trong cơ sở sáng tạo. Ví dụ:

  • Các đống nhị thức dựa trên các số nhị phân và các đống nhị thức xiên phức tạp hơn dựa trên các số nhị phân xiên.
  • Một số thuật toán để tạo ra các hoán vị có thứ tự từ vựng dựa trên hệ thống số nhân tử.
  • Tries có thể được coi là cây nhìn vào một chữ số của chuỗi tại một thời điểm, để tìm một cơ sở thích hợp.
  • Cây mã hóa Huffman được thiết kế để mỗi cạnh trong cây mã hóa một số không hoặc một trong một số biểu diễn nhị phân.
  • Mã hóa Fibonacci được sử dụng trong tìm kiếm Fibonacci và đảo ngược một số loại logarit nhất định.

Câu hỏi của tôi là: có những thuật toán nào khác sử dụng hệ thống số thông minh như một bước chính của trực giác hoặc bằng chứng của chúng? . Tôi đang nghĩ đến việc tập hợp một bài nói chuyện về chủ đề này, vì vậy tôi càng phải rút ra nhiều ví dụ thì càng tốt.


5
Tôi cũng thích câu hỏi này, nhưng làm thế nào để bạn chọn câu trả lời 'đúng'? Đây có nên là wiki cộng đồng không?
vlad

14
Đây phải là wiki cộng đồng
BlueRaja - Danny Pflughoeft.

18
@close cử tri: Nếu câu hỏi về thuật toán lạc đề ở SO, thì tôi không biết ở đây là chủ đề gì. Câu hỏi dành cho người mới quen thuộc về CSS? "tôi có thể haz regex plzz"? "làm ơn gửi email tới bạn codez 4 mi hoemwok"?
MAK

2
Hitchhiker's Guide to the Galaxy: Câu trả lời cho Sự sống, Vũ trụ và Mọi thứ là gì? Câu trả lời của Deep Thought: 42. Trái đất như một cỗ máy để tìm ra câu hỏi: 9 x 6 là gì? và đây là lý do tại sao mọi thứ đều tăng vọt. Nhìn trên một teeshirt: 9 (cơ số 13) x 6 (cơ số 13) = 42 (cơ số 13). QED.
Chris Walton

"có những thuật toán nào khác sử dụng một hệ thống số thông minh như một bước quan trọng của trực giác hoặc bằng chứng của chúng?" Stack Overflow không phải là một Công cụ đề xuất , một danh sách tất cả mọi thứ hay một trang liên kết . Các thuật toán để giải quyết các câu hỏi lập trình thực tế, hoàn toàn. Không. Bạn có thể muốn hỏi meta Toán học nếu họ muốn điều này.

Câu trả lời:


39

Chris Okasaki có một chương rất hay trong cuốn sách Cấu trúc dữ liệu chức năng thuần túy thảo luận về "Biểu diễn số": về cơ bản, lấy một số biểu diễn của một số và chuyển nó thành cấu trúc dữ liệu. Để mang lại hương vị, đây là các phần của chương đó:

  1. Hệ thống số vị trí
  2. Số nhị phân (Danh sách truy cập ngẫu nhiên nhị phân, Đại diện không có Zeroless, Đại diện lười biếng, Đại diện theo phân đoạn)
  3. Số nhị phân Skew (Danh sách truy cập ngẫu nhiên nhị phân Skew, đống nhị thức xiên)
  4. Số bậc ba và số bậc bốn

Một số thủ thuật hay nhất, được chắt lọc:

  • Phân biệt giữa biểu diễn dày đặcthưa thớt của số (thông thường bạn thấy điều này trong ma trận hoặc đồ thị, nhưng nó cũng có thể áp dụng cho số!)
  • Hệ thống số dự phòng (hệ thống có nhiều hơn một biểu diễn của một số) rất hữu ích.
  • Nếu bạn sắp xếp chữ số đầu tiên khác 0 hoặc sử dụng biểu diễn không có số không, việc truy xuất phần đầu của cấu trúc dữ liệu có thể hiệu quả.
  • Tránh các khoản vay theo tầng (từ việc lấy phần đuôi của danh sách) và chuyển (từ việc đưa vào danh sách) bằng cách phân đoạn cấu trúc dữ liệu

Đây cũng là danh sách tham khảo cho chương đó:

  • Guibas, McCreight, Plass và Roberts: Một đại diện mới cho danh sách tuyến tính.
  • Myers: Một ngăn xếp truy cập ngẫu nhiên ứng dụng
  • Carlsson, Munro, Poblete: Một hàng đợi nhị thức ngầm với thời gian chèn không đổi.
  • Kaplan, Tarjan: Danh sách hoàn toàn có chức năng với phân loại thông qua làm chậm đệ quy.

2
+1 Tôi có một bản sao của cuốn sách của Okasaki ... Tôi thích những chương đó và chúng là một phần lý do tại sao tôi lại đặt câu hỏi này (đống nhị thức xiên khởi động rất hay!) Tuy nhiên, tôi đã không đọc hết nó có lẽ tôi nên. Ngoài ra, tôi sẽ kiểm tra các tài liệu tham khảo đó; họ trông thật tuyệt.
templatetypedef

Toàn bộ luận án của Okasaky có sẵn trực tuyến: cs.cmu.edu/~rwh/theses/okasaki.pdf
Gigi

20

"Số bậc ba có thể được sử dụng để truyền đạt các cấu trúc tự tương tự như Tam giác Sierpinski hoặc tập hợp Cantor một cách thuận tiện." nguồn

"Số bậc bốn được sử dụng trong biểu diễn các đường cong Hilbert 2D." nguồn

"Hệ thống chữ số ảo bậc bốn lần đầu tiên được đề xuất bởi Donald Knuth vào năm 1955, trong một lần nộp cho một cuộc tìm kiếm tài năng khoa học trung học. Nó là một hệ thống chữ số vị trí phi tiêu chuẩn sử dụng số ảo 2i làm cơ sở của nó. Nó có thể để biểu diễn mọi số phức chỉ sử dụng các chữ số 0, 1, 2 và 3. " nguồn

"Chữ số La Mã là một hệ thống nhị phân." nguồn

"Số nguyên tố có thể được coi là hữu ích trong việc nghiên cứu các số nguyên tố vì tất cả các số nguyên tố, khi được biểu thị trong cơ số sáu, ngoại trừ 2 và 3 đều có 1 hoặc 5 là chữ số cuối cùng." nguồn

"Hệ thập phân (cơ số 60) là một hệ thống chữ số với sáu mươi làm cơ số. Nó có nguồn gốc từ người Sumer cổ đại vào thiên niên kỷ thứ 3 trước Công nguyên, nó được truyền lại cho người Babylon cổ đại, và nó vẫn được sử dụng - ở dạng sửa đổi - để đo lường thời gian, góc và tọa độ địa lý là góc. " nguồn

Vân vân...

Danh sách này là một điểm khởi đầu tốt.


6
Không ai trong số này có liên quan đến thuật toán ..
BlueRaja - Danny Pflughoeft

11
Chắc chắn rồi. Xây dựng hình tam giác Sierpinski Triangle theo bậc ba hoặc tính toán tọa độ địa lý dưới dạng số thập phân. Làm thế nào về một thuật toán để chuyển đổi chữ số la mã thành số thập phân? Làm thế nào về các thuật toán tìm số nguyên tố dựa trên hệ thống chuỗi?
Benjamin

9

Tôi đã đọc câu hỏi của bạn vào ngày hôm trước và hôm nay gặp phải một vấn đề: Làm cách nào để tạo tất cả các phân vùng của một tập hợp? Giải pháp xảy ra với tôi và tôi đã sử dụng (có thể do đọc câu hỏi của bạn) là:

Đối với một tập hợp có (n) phần tử, trong đó tôi cần (p) phân vùng, hãy đếm qua tất cả (n) số chữ số trong cơ số (p).

Mỗi số tương ứng với một phân vùng. Mỗi chữ số tương ứng với một phần tử trong tập hợp và giá trị của chữ số cho bạn biết phân vùng nào để đưa phần tử vào.

Nó không tuyệt vời, nhưng nó gọn gàng. Nó hoàn chỉnh, không gây dư thừa và sử dụng các cơ sở tùy ý. Cơ sở bạn sử dụng phụ thuộc vào vấn đề phân vùng cụ thể.


3
Tôi nghĩ rằng điều này hoàn toàn bị đánh cắp từ bài đăng của templatetypedef, nó hẳn đã bị mắc kẹt trong tiềm thức của tôi. Tôi chỉ để lại nó vì nó nói về nhiều cơ sở hơn là chỉ nhị phân.
Ben Horner

2
Điều này tạo ra tất cả các phân vùng có nhiều nhất p phân vùng và nó có dư thừa. Làm thế nào là 111222khác biệt với 222111?
Null Set

7

Gần đây tôi đã biết một thuật toán thú vị để tạo các tập hợp con theo thứ tự từ vựng dựa trên các biểu diễn nhị phân của các số từ 0 đến 2 n - 1. Nó sử dụng các bit của số để xác định phần tử nào nên được chọn cho tập hợp và sắp xếp lại cục bộ các bộ được tạo để sắp xếp chúng theo thứ tự từ vựng. Nếu bạn tò mò, tôi có một bài viết được đăng ở đây .

Ngoài ra, nhiều thuật toán dựa trên việc chia tỷ lệ (chẳng hạn như phiên bản đa thức yếu của thuật toán dòng cực đại Ford-Fulkerson), sử dụng biểu diễn nhị phân của các số trong bài toán đầu vào để tinh chỉnh dần một xấp xỉ thô thành một giải pháp hoàn chỉnh.


2
Đây là cách đơn giản nhất của các tập con tạo :)
st0le

Đó là cách đếm đơn giản nhất trong khái niệm tổ hợp.
Saeed Amiri

@ st0le- Tôi nghĩ rằng điều này phức tạp hơn một chút so với phiên bản tiêu chuẩn vì danh sách này đặt theo thứ tự từ vựng, thay vì thứ tự thông thường mà bạn nhận được từ ánh xạ 1-1 giữa các bit và tập hợp bao gồm.
templatetypedef,

6

Không hẳn là một hệ thống cơ sở thông minh mà là một cách sử dụng thông minh của hệ thống cơ sở: Các chuỗi Van der Corput là các chuỗi có độ chênh lệch thấp được hình thành bằng cách đảo ngược biểu diễn cơ số n của các số. Chúng được sử dụng để xây dựng các chuỗi Halton 2 chiều trông giống như thế này .


6

Tôi mơ hồ nhớ điều gì đó về hệ cơ số kép để tăng tốc một số phép nhân ma trận.

Hệ thống cơ sở kép là một hệ thống dự phòng sử dụng hai cơ số cho một số.

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

Dự phòng có nghĩa là một số có thể được chỉ định theo nhiều cách.

Bạn có thể tìm bài báo "Thuật toán kết hợp để tính toán đa thức ma trận" của Vassil Dimitrov, Todor Cooklev.

Cố gắng đưa ra cái nhìn tổng quan ngắn gọn nhất mà tôi có thể.

Họ đang cố gắng tính đa thức ma trận G(N,A) = I + A + ... + A^{N-1}.

Bỏ N là hợp G(N,A) = G(J,A) * G(K, A^J), nếu áp dụng cho J = 2, chúng ta nhận được:

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

cũng thế,

         / (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

Vì "hiển nhiên" (nói đùa) rằng một số phương trình này nhanh hơn ở hệ thứ nhất và một số phương trình tốt hơn ở hệ thứ hai - vì vậy, bạn nên chọn phương trình tốt nhất tùy thuộc vào N. Nhưng điều này sẽ yêu cầu hoạt động mô-đun nhanh cho cả 2 và 3. Đây là lý do tại sao đế kép xuất hiện - về cơ bản bạn có thể thực hiện nhanh hoạt động mô-đun cho cả hai để tạo cho bạn một hệ thống kết hợp:

         / (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

Hãy xem bài viết để được giải thích rõ hơn vì tôi không phải là chuyên gia trong lĩnh vực này.



5

đây là một bài đăng hay về việc sử dụng số bậc ba để giải quyết vấn đề "tiền giả" (trong đó bạn phải phát hiện một đồng tiền giả duy nhất trong một túi tiền thông thường, sử dụng số dư ít lần nhất có thể)


Đây là một bài đăng tuyệt vời và tôi đã sử dụng nó trong một bài nói chuyện mà tôi đã đưa ra có tên "Vui vẻ với Hệ thống số". Cảm ơn rất nhiều cho đăng nó!
templatetypedef

chào mừng bạn và rất vui vì bạn đã có thể sử dụng nó!
Martin DeMello

5

Các chuỗi băm (ví dụ trong thuật toán Rabin-Karp ) thường đánh giá chuỗi là một số cơ số b gồm n chữ số (trong đó n là độ dài của chuỗi và b là một số cơ số được chọn đủ lớn). Ví dụ, chuỗi "ABCD" có thể được băm thành:

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

Thay thế các giá trị ASCII cho các ký tự và lấy b là 256 thì điều này sẽ trở thành,

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

Mặc dù vậy, trong hầu hết các ứng dụng thực tế, giá trị kết quả được lấy theo mô đun một số có kích thước hợp lý để giữ cho kết quả đủ nhỏ.



4

Trong Hackers Delight(một cuốn sách mà mọi lập trình viên nên biết trong mắt tôi) có một chương hoàn chỉnh về các base không sử dụng được, như -2 là base (yea, right negative base) hoặc -1 + i (i as virtual unit sqrt (-1)) as căn cứ. Ngoài ra, tôi cũng tính toán tốt cơ sở tốt nhất là gì (về thiết kế phần cứng, cho tất cả những ai không muốn đọc nó: Nghiệm của phương trình là e, vì vậy bạn có thể đi với 2 hoặc 3, 3 sẽ tốt hơn một chút (hệ số Tốt hơn 1,056 lần so với 2) - nhưng kỹ thuật thực tế hơn).

Những thứ khác mà tôi nghĩ đến là bộ đếm màu xám (khi bạn đếm trong hệ thống này chỉ thay đổi 1 bit, bạn thường sử dụng thuộc tính này trong thiết kế phần cứng để giảm các vấn đề về tính ổn định) hoặc sự tổng quát của mã hóa Huffmann đã được đề cập - mã hóa số học.


3

Mật mã học sử dụng rộng rãi các vòng số nguyên (số học mô-đun) và các trường hữu hạn, mà các phép toán của chúng dựa trên trực giác dựa trên cách xử lý của đa thức với hệ số nguyên.



1

Câu hỏi tuyệt vời. Danh sách thực sự dài. Thời gian chính xác là một ví dụ đơn giản của cơ sở hỗn hợp (ngày | giờ | phút | giây | sáng / chiều)

Tôi đã tạo một khuôn khổ n-tuple liệt kê siêu cơ sở nếu bạn muốn nghe về nó. Đó là một số đường cú pháp rất ngọt ngào cho các hệ thống đánh số cơ sở. Nó vẫn chưa được phát hành. Gửi email tên người dùng của tôi (tại gmail).


1
Và bất kỳ hệ thống lịch nào - Maya, Lunar, Babylon .... cùng với tiền tệ Anh trước năm 1971 (LSD). Như bạn nói danh sách vẫn tiếp tục.
Chris Walton,

1

Một trong những mục yêu thích của tôi khi sử dụng cơ sở 2 là Mã hóa số học . Nó không bình thường bởi vì sơ lược của thuật toán sử dụng các đại diện của các số từ 0 đến 1 trong hệ nhị phân.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.