หนึ่งจะสร้างลำดับไบนารีทั้งหมดได้อย่างมีประสิทธิภาพด้วยจำนวนที่เท่ากันของ 0 และ 1 อย่างไร


10

ลำดับไบนารีของความยาวเป็นเพียงลำดับเพื่อให้แต่ละเป็นทั้งหรือ1เพื่อสร้างลำดับไบนารีดังกล่าวทั้งหมดเราสามารถใช้โครงสร้างต้นไม้ไบนารีที่เห็นได้ชัดในวิธีต่อไปนี้: รากคือ "ว่าง" แต่ลูกซ้ายแต่ละคนสอดคล้องกับการเพิ่มถึงสตริงที่มีอยู่และแต่ละลูกที่เหมาะสมกับ . ทีนี้ลำดับของไบนารีแต่ละคู่เป็นเพียงเส้นทางที่มีความยาวเริ่มต้นที่รูทและจบที่ลีฟnx1,,xnxj0101n+1

นี่คือคำถามของฉัน:

เราสามารถทำได้ดีกว่าถ้าเราเพียง แต่ต้องการสร้างสตริงไบนารีทั้งหมดของความยาวที่มีได้อย่างแม่นยำศูนย์และคน?2nnn

โดย "เราทำได้ดีกว่า" ฉันหมายความว่าเราควรมีความซับซ้อนต่ำกว่าอัลกอริธึมโง่ที่สร้างต้นไม้ทั้งหมดขึ้นด้านบนแล้วพยายามหาเส้นทางเหล่านั้นด้วยขอบซ้ายและขวา


คุณสามารถหาวิธีสร้างลำดับที่เพิ่มขึ้นอย่างเข้มงวดของตัวเลขทั้งหมดในช่วงตั้งแต่ 1 ถึงหรือไม่ n2n
แบรนด์คอร์นีเลียส

ฉันไม่สามารถแสดงความคิดเห็นเกี่ยวกับความซับซ้อน แต่อัลกอริทึมไร้เดียงสาของฉันจะสร้างการเดินตามขอบของตารางสี่เหลี่ยมจากมุมหนึ่งไปยังแนวทแยงมุมโดยใช้รูปแบบย้อนรอย นั่นหมายความว่า 01 และ 10 จบลงในตำแหน่งเดียวกัน (ไม่เหมือนต้นไม้ของคุณ) แต่ด้วย backtrack เรารู้ประวัติศาสตร์นี้
Hendrik Jan

เมื่อทราบที่แตกต่างกันอาจจะเป็นที่นี่เป็นการใช้ Java ของ -iterator (nk)
Pål GD

คำตอบ:


6

เห็นได้ชัดว่ามีสตริงไบนารีของความยาว2nเพื่อสำรวจไบนารีอัลกอริทึมต้องไปที่แต่ละโหนดหนึ่งครั้งนั่นคือต้องทำ ขั้นตอน4n2n

i=02n2i=22n+11=O(4n)

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

(2nn)=(2n)!(n!)2=4nπn(1+O(1/n))

แก้ไข
ขอบคุณความคิดเห็นของ Peter Shor เรายังสามารถวิเคราะห์จำนวนขั้นตอนที่ต้องการโดยอัลกอริทึมที่สองซึ่งนับ 1 และ 0 ฉันกำลังพูดถึงความคิดเห็นของเขาจากด้านล่าง:

เราต้องการค้นหาลำดับเลขฐานสองทั้งหมดที่มี 0's และ 1 ทุกประการ เราสำรวจต้นไม้ไบนารีที่แต่ละโหนดเป็นลำดับที่มากที่สุด 0's และ 1's เราไม่จำเป็นต้องไปที่โหนดใด ๆ ที่มีมากกว่า 0 หรือมากกว่า 1 เราต้องไปกี่โหนด มีสตริงมี 0's และ 1 ผลรวมทั้งหมดนี้ให้ . ตอนนี้เราต้องไปที่แต่ละโหนดเหล่านี้ในราคาเฉลี่ยต่อโหนดคงที่ เราสามารถทำได้โดยไปที่ลูกซ้ายแต่ละคนก่อนและลูกขวาแต่ละคนเป็นอันดับสองnn2nnn(i+ji)iji,jni=0nj=0n(i+ji)=(2n+2n+1)1

การใช้สูตรของสเตอร์ลิงอีกครั้งเราได้รับ เป็นเวลาทำงานของอัลกอริธึมใหม่

(2n+2n+1)1=4n+11n+1(1+O(1/n))1=O(4nn)

คุณต้องระวังให้มากขึ้นอีกหน่อย สันนิษฐานว่าหลังจากการสร้างแต่ละสาย, เราจะประมวลผลในเวลา ดังนั้นเพียงแค่การประมวลผลสตริงสมดุลทั้งหมดต้องใช้เวลา{n}) หากอัลกอริธึมการสร้างที่ "โง่" ที่ได้รับการปรับปรุงให้ดีที่สุดคือแน่นอนว่าไม่มีอะไรที่จะได้รับมากนักเมื่อเปลี่ยนมาใช้อัลกอริทึมที่ชาญฉลาดกว่าโอกาสสำหรับข้อบกพร่อง Ω(n)Ω(4nn)O(4n)
Yuval Filmus

@Yuval Filmus: คุณหมายถึงอะไร "การประมวลผลสตริง"? ถ้าคุณหมายถึงเวลาที่ใช้ในการส่งออกซึ่งเป็นที่แน่นอนแล้วคุณจะต้องพิจารณาปัจจัยที่ยังอยู่ในเวลาการทำงานของ "โง่" อัลกอริทึมที่แล้วคือNN) Θ(n)O(4nn)
tranisstor

2
ประเด็นของฉันคือถ้าคุณกังวลกับความแตกต่างระหว่างและดังนั้นอย่างน้อยที่สุดคุณต้องระบุเวลาทำงานที่ถูกต้อง ไม่เพียงพอที่จะเปิดเผยความแตกต่างที่เป็นไปได้ระหว่างอัลกอริธึมทั้งสอง นอกจากนี้คุณต้องระมัดระวังในการวิเคราะห์อัลกอริทึมใหม่ที่เสนอเพื่อดูว่าปัจจัยเล็ก ๆ น้อย ๆ เหล่านี้ไม่ได้ทำให้ช้ากว่าอัลกอริธึมเล็กน้อย 4n4n/nO~(4n)
Yuval Filmus

2
คุณจะสร้าง "ส่วนที่ดี" ของต้นไม้ได้อย่างไรโดยไม่ต้องใส่ "ส่วนที่ไม่ดี" ด้วย? คุณต้องรวมโหนดทั้งหมดของต้นไม้ซึ่งไม่มีลูกที่เหลืออยู่มากกว่าลูกหรือเด็กที่ถูกต้องบนเส้นทางจากรูทถึงพวกเขา ใช้งานได้ แต่คุณต้องมีอาร์กิวเมนต์เพิ่มเติมเพื่อแสดงว่าทำงานได้ โดยเฉพาะคุณจะต้องใช้สูตร-1 nni=0nj=0n(i+ji)=(2n+2n+1)1
Peter Shor

2
เราต้องการค้นหาลำดับเลขฐานสองทั้งหมดที่มี 0's และ 1 ทุกประการ เราสำรวจต้นไม้ไบนารีที่แต่ละโหนดเป็นลำดับที่มากที่สุด 0's และ 1's เราไม่จำเป็นต้องไปที่โหนดใด ๆ ที่มีมากกว่า 0 หรือมากกว่า 1 เราต้องไปกี่โหนด มีสตริงด้วย 0's และ 1 ผลรวมทั้งหมดนี้ให้ . ตอนนี้เราต้องไปที่แต่ละโหนดเหล่านี้ในราคาเฉลี่ยต่อโหนดคงที่ เราสามารถทำได้โดยไปที่ลูกซ้ายแต่ละคนก่อนและลูกขวาแต่ละคนเป็นอันดับสองnn2nnn(i+ji)iji,jni=0nj=0n(i+ji)=(2n+2n+1)1
ปีเตอร์ชอร์

2

บางทีฉันอาจจะหนา แต่คำถามเดิมขอวิธีสร้างไบนารีแบบ "สมดุล" ทั้งหมดที่มีความยาว 2n ซึ่งมีประสิทธิภาพมากกว่าการสำรวจต้นไม้ของลำดับไบนารีทั้งหมดที่มีความยาว 2n และแสดงเฉพาะที่สมดุล เหตุใดจึงต้องใช้ต้นไม้เลย?

นี่คือรหัสเทียมสำหรับอัลกอริทึมแบบเรียกซ้ำที่สร้างลำดับดังกล่าวทั้งหมด (คำหลัก "ผลผลิต" ส่งลำดับไปยังเอาต์พุต):

function all-balanced(n) {
  all-specified( "", n, n );
};

function all-specified( currentString, zeroes, ones ) {

  if (zeroes == 0) {
    for i = 0 to ones {
      currentString += "1";
    };
    yield currentString;
    return;
  };

  if (ones == 0) {
    for i = 0 to zeroes {
      currentString += "0";
    };
    yield currentString;
    return;
  };

  all-specified( currentString+"0", zeroes-1, ones );
  all-specified( currentString+"1", zeroes, ones-1 );
  return;
};

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

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