ใช้ลำดับ de Bruijn เพื่อค้นหา


11

ฌอนแอนเดอร์สันตีพิมพ์แฮ็กแบบทวิปสองบิตที่มีอัลกอริทึมของ Eric Cole เพื่อค้นหาเข้าสู่ระบบ2โวลต์ของยังไม่มีข้อความ -bit จำนวนเต็มโวลต์ในการดำเนินการO(LG(ยังไม่มีข้อความ))ด้วยการคูณและค้นหา

อัลกอริทึมนั้นอาศัยหมายเลข "เวทมนต์" จากลำดับ De Bruijn ใครสามารถอธิบายคุณสมบัติทางคณิตศาสตร์พื้นฐานของลำดับที่ใช้ที่นี่ได้ไหม

uint32_t v; // find the log base 2 of 32-bit v
int r;      // result goes here

static const int MultiplyDeBruijnBitPosition[32] = 
{
  0, 9, 1, 10, 13, 21, 2, 29, 11, 14, 16, 18, 22, 25, 3, 30,
  8, 12, 20, 28, 15, 17, 24, 7, 19, 27, 23, 6, 26, 5, 4, 31
};

v |= v >> 1; // first round down to one less than a power of 2 
v |= v >> 2;
v |= v >> 4;
v |= v >> 8;
v |= v >> 16;

r = MultiplyDeBruijnBitPosition[(uint32_t)(v * 0x07C4ACDDU) >> 27];

2
ความคิดที่มาจากกระดาษนี้supertech.csail.mit.edu/papers/debruijn.pdf ลำดับเดอ Brujn ขนาด2kเป็นวิธีที่จะเป็นตัวแทนของสตริงบิตทั้งหมดของขนาดkรัดกุมมาก: แต่ละสตริงที่เป็นไปได้ปรากฏขึ้นเพียงครั้งเดียวเป็นลำดับที่ต่อเนื่องกัน ดังนั้นหากคุณเลื่อนลำดับ de Bruijn โดยn2kบิตและอ่านkบิตสุดท้ายคุณจะมีตัวระบุเฉพาะสำหรับn n
Sasho Nikolov

1
วิธีนี้คำนวณได้เพียงเข้าสู่ระบบ2โวลต์ ; และตามที่เขียนไว้มันใช้ได้กับจำนวนเต็ม 32 บิตเท่านั้น
Sasho Nikolov

1
@Sasho เปลี่ยนเป็นคำตอบหรือไม่?
Yuval Filmus

@SashoNikolov ขอบคุณเพิ่มฟังก์ชันเพดานกับคำถาม
Yury Bayda

คำตอบ:


9

โปรดทราบว่าอัลกอริธึมนี้คำนวณเฉพาะและเมื่อเขียนโค้ดมันจะใช้ได้กับvที่พอดีกับคำ32บิตเท่านั้นเข้าสู่ระบบ2โวลต์โวลต์32

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

ส่วนที่น่าสนใจคือเคล็ดลับ de Bruijn ซึ่งมาจากเอกสารของLeiserson, Prokop และ Randall (เห็นได้ชัดว่าอาจารย์ของ MIT ใช้เวลาในการแฮ็กบิต :)) สิ่งที่คุณต้องรู้เกี่ยวกับลำดับเดอ Bruijnคือมันเป็นตัวแทนลำดับที่เป็นไปได้ทั้งหมดของความยาวที่กำหนดในแบบที่ถูกบีบอัดมากที่สุด แม่นยำลำดับเดอบรูจเหนือตัวอักษรคือสตริงไบนารีs ที่มีความยาว2 kซึ่งแต่ละความยาวkสตริงสตริงปรากฏขึ้นเพียงครั้งเดียวเป็นสตริงย่อยที่ต่อเนื่องกัน (อนุญาตให้ล้อมรอบได้) เหตุผลนี้มีประโยชน์คือถ้าคุณมีหมายเลขX{0,1}s2kkXซึ่งการแทนค่าบิตเป็นลำดับ de Bruijn (เต็มด้วยศูนย์) จากนั้นkบิตสูงสุดของ2 i X จะระบุiโดยเฉพาะ(ตราบเท่าที่ฉัน< k )kk2ผมXผมผม<k


3
โปรดทราบว่าคุณสามารถใช้ใด ๆ เดอ Bruijn ลำดับในลักษณะนี้เพื่อคำนวณได้รับ2ฉัน แต่คุณไม่สามารถใช้พลเดอ Bruijn ลำดับการคำนวณฉันได้รับ2 ฉัน - 1 ที่นี่ 0x07C4ACDD = 00000111110001001010110011011101 ดูเหมือนว่าจะเป็นลำดับ de Bruijn ที่มีคุณสมบัติเพิ่มเติมบางส่วนขอบคุณที่เพิ่มเติม- 1ไม่ทำลายวิธีนี้ ผม2ผมi2i1-1
Jukka Suomela

ขอบคุณ @JukkaSuomela ฉันสับสนเล็กน้อยเกี่ยวกับเรื่องนี้ ฉันเดาว่าคุณสามารถเพิ่ม 1 ลงในได้ตลอดเวลา โวลต์
Sasho Nikolov

5

ความคิดเห็นบางอย่าง (ไม่ใช่คำตอบจริงๆ) Let 's ประเภท 32 บิตจำนวนเต็มดังต่อไปนี้:

  • ประเภท X: (เป็นสตริงไบนารี) คือลำดับ De Bruijn (สำหรับการหมุนทั้งหมดบิต [27,31] แตกต่างกัน) ตัวอย่าง:

    11111011100110101100010100100000
    
  • ประเภท Y: บิต [27,31] ของมีความแตกต่างกันสำหรับฉัน= 0 , 1 , . . , 31 . นี่คือสิ่งที่Leiserson และคณะ การใช้งาน ตัวอย่าง:2ผมผม=0,1,...,วันที่ 31

    00000100011001010011101011011111
    00001111101110011010110001010010
    
  • ประเภท Z: บิต [27,31] ของมีความแตกต่างกันสำหรับฉัน= 0 , 1 , . . , 31 . นี่คือสิ่งที่เราต้องการในคำถามเดิม ตัวอย่าง:(2ผม+1-1)ผม=0,1,...,วันที่ 31

    00000111110001001010110011011101  (07C4ACDD)
    10000111110001001010110011011101
    01111000001110110101001100100011
    11111000001110110101001100100011
    

ข้อสังเกตบางอย่างจากการทดสอบอย่างรวดเร็ว (ฉันหวังว่าฉันจะได้รับสิ่งเหล่านี้):

  1. มีจำนวนเต็ม 65536 ประเภท X

  2. มีจำนวนเต็ม 4096 ของประเภท X + Y นี่คือจำนวนเต็มของประเภท X ที่ขึ้นต้นด้วยลำดับ '0000 ... '

    • ปรีชา: ด้วยเลขศูนย์นำหน้า, การหมุน = การเลื่อน?
  3. มีจำนวนเต็ม 256 ชนิดของ X + Y + Z นี่คือจำนวนเต็มของประเภท X ที่ขึ้นต้นด้วยลำดับ '0000011111 ... '

    • ปรีชา: ??
  4. จำนวนเต็มทั้งหมดของประเภท Y ก็เป็นประเภท X

  5. อย่างไรก็ตามยังมีจำนวนเต็ม 768 ของชนิด Z ที่ไม่ใช่แบบ X และชนิด Y ซึ่งเริ่มต้นด้วย '1000011111 ... ', '0111100000 ... ' หรือ '1111100000 ... '


1
นี่เป็นคำตอบเดียวที่เกี่ยวข้องกับสาเหตุที่การคูณของ De Bruijn ด้วย 2 ^ n-1 ทำงานเมื่อเทียบกับ 2 ^ n ซึ่งเป็นเพียงการเปลี่ยนแปลง ฉันจะรักมันถ้ามีคนสามารถขยาย "ปรีชา" ของ # 3 ข้างต้น Eric Cole เกิดขึ้นกับสิ่งนี้ได้อย่างไร ลองผิดลองถูก? หรือความเข้าใจว่าเกิดอะไรขึ้นกับบิตเมื่อคุณคูณด้วย 2 ^ n-1
FarmerBob

1
  • ค่าคงที่นี้มาจากไหน

การอ้างถึง: "ในวันที่ 10 ธันวาคม 2009 มาร์คดิกคินสันโกนการดำเนินงานสองสามครั้งโดยกำหนดให้ v ถูกปัดขึ้นให้เหลือน้อยกว่าหนึ่งในพลังถัดไปของ 2 แทนที่จะเป็นพลังของ 2" [graphics.stanford.edu/~seander/bithacks.html]

ค่าคงตัวอนุภาคนี้เป็นลำดับ De Bruijn ด้วยตัวอักษรไบนารี แต่มีคุณสมบัติพิเศษ ฉันจะเรียกมันว่า 'มาร์คดิกคินสันพร็อพเพอร์ตี้' เนื่องจากอัลกอรึทึมดั้งเดิมสามารถนำไปใช้ได้โดยไม่ต้องมีลำดับฐานข้อมูลพิเศษเหล่านี้ ด้วยการผนวก 2 การดำเนินการเพิ่มเติมเราสามารถใช้ลำดับฐานข้อมูลใด ๆ การทำงาน: v ^ = (v >> 1); // clr บิตทั้งหมดยกเว้นชุด MSB หลังจาก cascading or-shift

  • ผลลัพธ์ (bruteforce)

Seq.Type | เลขจำนวนเต็ม เลขที่ DBSeq ด้วย | ไม่มีการหมุน กับ Dickinson Property
B (2, 3) | 256 | 16 | 2 | 1
B (2, 4) | 64Ki | 256 | 16 | 4
B (2, 5) | 04Gi | 64Ki | 02Ki | 256
B (2, 6) | 16Ei | 04Gi | 64Mi | ??

  • คุณสมบัติพิเศษ

0x74ADD * * * *2k1(พอควร232)32k1ป้อนคำอธิบายรูปภาพที่นี่2k1

  • ลำดับไบนารีไบนารีเดอบรูนที่เล็กที่สุดในการพิมพ์ด้วยดิกคินสันพร็อพเพอร์ตี้

    [B (2,3): 0x1D] [B (2,4): 0x0F2D] [B (2,5): 0x7C4ACDD] [B (2,6): ยังคงค้นหาอยู่]

หากคุณหวังว่าสูตรทางคณิตศาสตร์ที่สง่างามที่จะอธิบายพวกเขาหรือทฤษฎีบทเพื่อผลิตพวกเขาหรือสิ่งที่คล้ายกันฉันคิดว่านี่จะต้องมีความเข้าใจอย่างลึกซึ้งในทฤษฎีจำนวนและสาขาอื่น ๆ ที่อยู่นอกเหนือทักษะของฉัน ถ้าฉันจะเดาได้ที่ไหนฉันจะพนันได้เลยว่าพวกเขาสามารถผลิตโดยออโตเซลล่า นี่ไม่ใช่คำตอบว่าทำไม? บนฐานที่เข้มงวด แต่พยายามที่จะเข้าใจว่าทำไมมันถึงใช้งานได้และทำไมมันถึงทำงานได้อย่างถูกต้องคุณจึงสามารถใช้มันได้อย่างมั่นใจ

ป.ล. ฉันไม่ได้ครอบคลุมการก่อสร้าง LUT ซึ่งสามารถอนุมานได้ง่ายถ้าคุณเข้าใจหลักการทำงานของอัลกอริทึม


สุดท้ายพบ: B (2,6) 0x3f08a4c6acb9dbd - ลำดับ 64 บิตเดอ bruijn กับ 'คุณสมบัติ Dickinson' ฉันพบลำดับดังกล่าวอย่างน้อย 122K
FranG
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.