อัลกอริทึมตามระบบฐานตัวเลข? [ปิด]


88

เมื่อเร็ว ๆ นี้ฉันสังเกตเห็นว่ามีอัลกอริทึมที่ยอดเยี่ยมมากมายโดยอิงจากบางส่วนหรือทั้งหมดโดยอาศัยการใช้ตัวเลขอย่างชาญฉลาดในฐานความคิดสร้างสรรค์ ตัวอย่างเช่น:

  • ไบโนเมียลฮีปขึ้นอยู่กับเลขฐานสองและฮีปทวินามที่ซับซ้อนมากขึ้นจะขึ้นอยู่กับเลขฐานสองเอียง
  • อัลกอริทึมบางอย่างสำหรับการสร้างการเรียงลำดับตามคำศัพท์ตามพจนานุกรมจะขึ้นอยู่กับระบบจำนวนแฟคตอเรดิค
  • การลองสามารถคิดได้ว่าเป็นต้นไม้ที่มองไปที่สตริงทีละหลักเพื่อให้ได้ฐานที่เหมาะสม
  • ต้นไม้การเข้ารหัส Huffman ได้รับการออกแบบให้แต่ละขอบในต้นไม้เข้ารหัสเป็นศูนย์หรือหนึ่งในการแทนค่าไบนารี
  • การเข้ารหัส Fibonacci ใช้ในการค้นหา Fibonacci และเพื่อสลับลอการิทึมบางประเภท

คำถามของฉันคือมีอัลกอริทึมอะไรอีกบ้างที่ใช้ระบบตัวเลขที่ชาญฉลาดเป็นขั้นตอนสำคัญของสัญชาตญาณหรือการพิสูจน์ . ฉันกำลังคิดที่จะพูดคุยเกี่ยวกับเรื่องนี้ดังนั้นยิ่งฉันต้องวาดตัวอย่างมากเท่าไหร่ก็ยิ่งดีเท่านั้น


5
ฉันชอบคำถามนี้เหมือนกัน แต่คุณจะเลือกคำตอบที่ 'ถูกต้อง' ได้อย่างไร? นี่ควรเป็นวิกิชุมชนไหม
ลาด

14
นี่ควรเป็นวิกิชุมชน
BlueRaja - Danny Pflughoeft

18
@ ปิดผู้มีสิทธิเลือกตั้ง: หากคำถามเกี่ยวกับอัลกอริทึมไม่อยู่ในหัวข้อที่ SO ฉันไม่รู้ว่ามีอะไรอยู่ในหัวข้อนี้ คำถามมือใหม่งี่เง่าเกี่ยวกับ CSS? "ฉันสามารถทำให้ regex plzz" ได้ไหม "กรุณาส่งอีเมลถึง codez 4 mi hoemwok"?
MAK

2
Hitchhiker's Guide to the Galaxy: คำตอบของชีวิตจักรวาลและทุกสิ่งคืออะไร? คำตอบของ Deep Thought: 42. Earth เป็นเครื่องค้นหาคำถาม: 9 x 6 คืออะไร? และนี่คือเหตุผลว่าทำไมทุกอย่างถึงขึ้น เห็นบนเสื้อยืด: 9 (ฐาน 13) x 6 (ฐาน 13) = 42 (ฐาน 13) QED
Chris Walton

"มีอัลกอริทึมอะไรอีกบ้างที่ใช้ระบบตัวเลขที่ชาญฉลาดเป็นขั้นตอนสำคัญของสัญชาตญาณหรือการพิสูจน์" กองมากเกินไม่ได้เป็นเครื่องยนต์แนะนำ , รายชื่อของทุกสิ่งหรือฟาร์ม link อัลกอริทึมสำหรับการแก้ปัญหาการเขียนโปรแกรมในทางปฏิบัติอย่างแน่นอน สำนักหักบัญชีสำหรับอัลกอริทึมที่ชาญฉลาดเลขที่ คุณอาจต้องการถามเกี่ยวกับmeta ของคณิตศาสตร์หากพวกเขาต้องการสิ่งนี้

คำตอบ:


39

Chris Okasaki มีบทที่ดีมากในหนังสือของเขาโครงสร้างข้อมูลที่ใช้งานได้อย่างหมดจดซึ่งกล่าวถึง "การเป็นตัวแทนเชิงตัวเลข" โดยพื้นฐานแล้วให้ใช้การแทนตัวเลขและแปลงเป็นโครงสร้างข้อมูล เพื่อให้ได้รสชาตินี่คือส่วนต่างๆของบทนั้น:

  1. ระบบตัวเลขตำแหน่ง
  2. เลขฐานสอง (รายการเข้าถึงโดยสุ่มแบบไบนารี, การเป็นตัวแทนแบบไม่มีศูนย์, การเป็นตัวแทนแบบขี้เกียจ, การแทนแบบแบ่งกลุ่ม)
  3. เบ้เลขฐานสอง (Skew Binary Random Access List, Skew Binomial Heaps)
  4. เลขฐานสองและควอเทอร์นารี

เทคนิคที่ดีที่สุดบางส่วนกลั่น:

  • แยกแยะระหว่างการแสดงตัวเลขแบบหนาแน่นและแบบเบาบาง (โดยปกติคุณจะเห็นสิ่งนี้ในเมทริกซ์หรือกราฟ แต่ใช้ได้กับตัวเลขด้วย!)
  • ระบบตัวเลขซ้ำซ้อน (ระบบที่มีการแสดงตัวเลขมากกว่าหนึ่งตัว) มีประโยชน์
  • หากคุณจัดเรียงตัวเลขหลักแรกให้ไม่เป็นศูนย์หรือใช้การแทนค่าที่ไม่มีศูนย์การดึงข้อมูลส่วนหัวของโครงสร้างข้อมูลจะมีประสิทธิภาพ
  • หลีกเลี่ยงการยืมแบบเรียงซ้อน (จากการเอาส่วนท้ายของรายการ) และดำเนินการ (จากการรวมเข้าในรายการ) โดยแบ่งโครงสร้างข้อมูล

นี่คือรายการอ้างอิงสำหรับบทนั้นด้วย:

  • Guibas, McCreight, Plass และ Roberts: การนำเสนอใหม่สำหรับรายการเชิงเส้น
  • Myers: สแต็กเข้าถึงโดยสุ่มที่ใช้งานได้
  • Carlsson, Munro, Poblete: คิวทวินามโดยนัยที่มีเวลาแทรกคงที่
  • Kaplan, Tarjan: รายการที่ใช้งานได้อย่างหมดจดพร้อม catenation ผ่านการวนซ้ำแบบช้าๆ

2
+1 ฉันมีสำเนาหนังสือของโอคาซากิ ... ฉันชอบบทเหล่านั้นและเป็นส่วนหนึ่งที่ทำให้ฉันถามคำถามนี้เลย (กองทวินามแบบเบ้สตราปนั้นเจ๋งมาก!) บางทีฉันควรจะ นอกจากนี้ฉันจะตรวจสอบข้อมูลอ้างอิงเหล่านั้น พวกเขาดูดีมาก
templatetypedef

วิทยานิพนธ์ฉบับเต็มของ Okasaky มีจำหน่ายทางออนไลน์: cs.cmu.edu/~rwh/theses/okasaki.pdf
Gigi

20

"ตัวเลข Ternary สามารถใช้เพื่อถ่ายทอดโครงสร้างที่คล้ายตัวเองเช่นสามเหลี่ยม Sierpinski หรือชุดต้นเสียงได้อย่างสะดวกสบาย" แหล่งที่มา

"ตัวเลขควอเทอร์นารีใช้ในการแทนเส้นโค้งฮิลแบร์ต 2 มิติ" แหล่งที่มา

"ระบบตัวเลขเชิงจินตภาพแบบควอเทอร์ได้รับการเสนอครั้งแรกโดย Donald Knuth ในปีพ. ศ. 2498 ในการส่งไปยังการค้นหาความสามารถทางวิทยาศาสตร์ระดับมัธยมศึกษาตอนปลายเป็นระบบตัวเลขตำแหน่งที่ไม่ได้มาตรฐานซึ่งใช้จำนวนจินตภาพ 2i เป็นฐานมันสามารถ เพื่อแทนจำนวนเชิงซ้อนโดยใช้เฉพาะตัวเลข 0, 1, 2 และ 3 " แหล่งที่มา

"เลขโรมันเป็นระบบเลขฐานสอง" แหล่งที่มา

"วุฒิสภาอาจได้รับการพิจารณาว่ามีประโยชน์ในการศึกษาจำนวนเฉพาะเนื่องจากทุกช่วงเวลาเมื่อแสดงเป็นฐานหกนอกเหนือจาก 2 และ 3 จะมี 1 หรือ 5 เป็นหลักสุดท้าย" แหล่งที่มา

"Sexagesimal (ฐาน 60) เป็นระบบตัวเลขที่มีหกสิบเป็นฐานมันมีต้นกำเนิดมาจากชาวสุเมเรียนโบราณในสหัสวรรษที่ 3 ก่อนคริสต์ศักราชมันถูกส่งต่อไปยังบาบิโลเนียโบราณและยังคงใช้ในรูปแบบที่ดัดแปลง - สำหรับการวัด เวลามุมและพิกัดทางภูมิศาสตร์ที่เป็นมุม " แหล่งที่มา

ฯลฯ ...

รายการนี้เป็นจุดเริ่มต้นที่ดี


6
สิ่งเหล่านี้ไม่เกี่ยวข้องกับอัลกอริทึม ..
BlueRaja - Danny Pflughoeft

11
แน่นอนว่าพวกเขาเป็น การสร้างสามเหลี่ยม Sierpinski Triangle ใน ternary หรือการคำนวณพิกัดทางภูมิศาสตร์ในเรื่องเพศ แล้วอัลกอริทึมสำหรับการแปลงตัวเลขโรมันเป็นทศนิยมล่ะ? แล้วอัลกอริทึมการค้นหาจำนวนเฉพาะตามระบบวุฒิสภาล่ะ
Benjamin

9

ฉันอ่านคำถามของคุณเมื่อวันก่อนและวันนี้ก็ประสบปัญหา: ฉันจะสร้างการแบ่งพาร์ติชันทั้งหมดของชุดได้อย่างไร? วิธีแก้ปัญหาที่เกิดขึ้นกับฉันและที่ฉันใช้ (อาจเกิดจากการอ่านคำถามของคุณ) คือ:

สำหรับชุดที่มีองค์ประกอบ (n) โดยที่ฉันต้องการ (p) พาร์ติชันให้นับตัวเลขทั้งหมด (n) หลักในฐาน (p)

แต่ละหมายเลขสอดคล้องกับการแบ่งพาร์ติชัน ตัวเลขแต่ละตัวจะสอดคล้องกับองค์ประกอบในชุดและค่าของตัวเลขจะบอกคุณว่าจะใส่องค์ประกอบใด

ไม่น่าทึ่ง แต่ก็เรียบร้อย เสร็จสมบูรณ์ไม่เกิดความซ้ำซ้อนและใช้ฐานตามอำเภอใจ ฐานที่คุณใช้ขึ้นอยู่กับปัญหาการแบ่งพาร์ติชันเฉพาะ


3
ฉันคิดว่านี่ถูกขโมยไปอย่างสมบูรณ์จากโพสต์ของ templatetypedef มันต้องติดอยู่ในจิตใต้สำนึกของฉันแน่ ๆ ฉันทิ้งมันไว้เพียงเพราะมันพูดถึงฐานมากกว่าไบนารี
Ben Horner

2
สิ่งนี้สร้างการแบ่งพาร์ติชันทั้งหมดโดยมีพาร์ติชันไม่เกิน p และมีความซ้ำซ้อน เป็นวิธีการที่111222แตกต่างจาก222111?
Null Set

7

ฉันเพิ่งเจออัลกอริทึมที่ยอดเยี่ยมสำหรับการสร้างเซตย่อยตามลำดับศัพท์ตามการแทนค่าไบนารีของตัวเลขระหว่าง 0 ถึง 2 n - 1 มันใช้บิตของตัวเลขทั้งคู่เพื่อกำหนดองค์ประกอบที่ควรเลือกสำหรับชุดและเพื่อเรียงลำดับใหม่ ชุดที่สร้างขึ้นเพื่อให้พวกเขาอยู่ในลำดับศัพท์ ถ้าคุณอยากรู้ฉันมีเขียนขึ้นโพสต์ที่นี่

นอกจากนี้อัลกอริทึมจำนวนมากยังขึ้นอยู่กับการปรับขนาด (เช่นอัลกอริธึมการไหลสูงสุดของฟอร์ด - ฟุลเคอร์สันเวอร์ชันที่อ่อนแอ) ซึ่งใช้การแทนค่าฐานสองของตัวเลขในปัญหาการป้อนข้อมูลเพื่อปรับแต่งการประมาณคร่าวๆให้เป็นโซลูชันที่สมบูรณ์


2
นี่เป็นวิธีที่ง่ายที่สุดในการสร้างเซตย่อย :)
st0le

นั่นเป็นวิธีที่ง่ายที่สุดในการนับในแนวคิดแบบผสมผสาน
Saeed Amiri

@ st0le- ฉันคิดว่านี่เป็นเรื่องที่ยากกว่าเวอร์ชันมาตรฐานเล็กน้อยเนื่องจากรายการนี้ตั้งค่าตามลำดับศัพท์แทนที่จะเป็นลำดับปกติที่คุณได้รับจากการแมปแบบหนึ่งต่อหนึ่งระหว่างบิตและการรวม
templatetypedef

6

ไม่ใช่ระบบฐานที่ชาญฉลาด แต่เป็นการใช้ระบบฐานอย่างชาญฉลาด: ลำดับVan der Corputเป็นลำดับความคลาดเคลื่อนต่ำที่เกิดจากการย้อนกลับการแทนค่า base-n ของตัวเลข พวกเขากำลังใช้ในการสร้าง 2-d ลำดับ Haltonที่ดูชนิดเช่นนี้


6

ฉันจำบางอย่างเกี่ยวกับระบบฐานสองได้อย่างคลุมเครือเพื่อเร่งการคูณเมทริกซ์

ระบบฐานคู่เป็นระบบซ้ำซ้อนที่ใช้สองฐานสำหรับหนึ่งหมายเลข

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

ซ้ำซ้อนหมายความว่าตัวเลขหนึ่งสามารถระบุได้หลายวิธี

คุณสามารถค้นหาบทความ "Hybrid Algorithm for the Computation of the Matrix Polynomial" โดย Vassil Dimitrov, Todor Cooklev

พยายามให้ภาพรวมสั้น ๆ ที่ดีที่สุดเท่าที่จะทำได้

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

5

การแฮชสตริง (เช่นในอัลกอริทึมRabin-Karp ) มักจะประเมินสตริงเป็นเลขฐาน b ที่ประกอบด้วยตัวเลข n หลัก (โดยที่ 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(หนังสือโปรแกรมเมอร์ทุกคนควรรู้ในสายตาของฉัน) มีบทที่สมบูรณ์เกี่ยวกับฐานที่ผิดปกติเช่น -2 เป็นฐาน (ใช่ฐานลบด้านขวา) หรือ -1 + i (ฉันเป็นหน่วยจินตภาพ sqrt (-1)) เป็น ฐาน. นอกจากนี้ฉันยังคำนวณได้ดีว่าฐานที่ดีที่สุดคืออะไร (ในแง่ของการออกแบบฮาร์ดแวร์สำหรับทุกคนที่ไม่ต้องการอ่าน: คำตอบของสมการคือ e ดังนั้นคุณสามารถใช้ 2 หรือ 3, 3 จะดีกว่าเล็กน้อย (ปัจจัย ดีกว่า 2 เท่า 1.056 เท่า - แต่เป็นทางเทคนิคมากกว่า)

สิ่งอื่น ๆ ที่อยู่ในใจของฉันคือตัวนับสีเทา (คุณเมื่อคุณนับการเปลี่ยนแปลงในระบบนี้เพียง 1 บิตคุณมักใช้คุณสมบัตินี้ในการออกแบบฮาร์ดแวร์เพื่อลดปัญหาความสามารถในการแพร่กระจาย) หรือการกำหนดลักษณะทั่วไปของการเข้ารหัส Huffmann ที่กล่าวถึงแล้วนั่นคือการเข้ารหัสเลขคณิต


3

การเข้ารหัสใช้ประโยชน์อย่างกว้างขวางของวงแหวนจำนวนเต็ม (เลขคณิตแบบแยกส่วน) และฟิลด์ จำกัด ซึ่งการดำเนินการจะขึ้นอยู่กับวิธีการทำงานของพหุนามที่มีสัมประสิทธิ์จำนวนเต็ม



1

คำถามที่ดี รายการยาวแน่นอน การบอกเวลาเป็นตัวอย่างง่ายๆของฐานผสม (วัน | ชั่วโมง | นาที | วินาที | น. / น.)

ฉันได้สร้างกรอบงาน n-tuple การแจงนับ meta-base แล้วหากคุณสนใจที่จะได้ยินเกี่ยวกับเรื่องนี้ เป็นน้ำตาลซินแทติกที่หวานมากสำหรับระบบเลขฐาน มันยังไม่เปิดตัว ส่งอีเมลชื่อผู้ใช้ของฉัน (ที่ gmail)


1
และระบบปฏิทินใด ๆ - มายัน, จันทรคติ, บาบิโลน .... พร้อมกับสกุลเงินอังกฤษก่อนปี พ.ศ. 2514 (LSD) ตามที่คุณบอกว่ารายการดำเนินต่อไป
Chris Walton

1

หนึ่งในรายการโปรดของฉันโดยใช้ฐานที่ 2 คือการเข้ารหัสเลขคณิต มันผิดปกติเพราะฮาร์ทของอัลกอริทึมใช้การแสดงตัวเลขระหว่าง 0 ถึง 1 ในไบนารี


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.