จำนวนเต็ม“ เกือบเรียงลำดับ” ในเวลาเชิงเส้น
ฉันสนใจในการเรียงลำดับอาร์เรย์ของค่าจำนวนเต็มบวกL=v1,…,vnL=v1,…,vnL = v_1, \ldots, v_nในเวลาเชิงเส้น (ในรูปแบบ RAM ที่มีการวัดต้นทุนสม่ำเสมอคือจำนวนเต็มสามารถมีขนาดได้ถึงลอการิทึม แต่การดำเนินการทางคณิตศาสตร์กับพวกมัน ใช้เวลาหน่วย) แน่นอนว่ามันเป็นไปไม่ได้ด้วยอัลกอริธึมการเรียงลำดับแบบเปรียบเทียบดังนั้นฉันจึงสนใจในการคำนวณการเรียงลำดับ "โดยประมาณ" เช่นการคำนวณการเปลี่ยนแปลงบางอย่างvσ(1),…,vσ(n)vσ(1),…,vσ(n)v_{\sigma(1)}, \ldots, v_{\sigma(n)}ของLLLซึ่งไม่ได้เรียงจริงๆในทั่วไป แต่ "ประมาณการที่ดี" ของรุ่นเรียงLLLLฉันจะสมมติว่าเรากำลังเรียงลำดับจำนวนเต็มในลำดับที่ลดลงเพราะมันจะทำให้ภาคต่อมีความสุขมากขึ้น แต่แน่นอนว่าเราสามารถพูดถึงปัญหาได้อีกทางหนึ่ง เกณฑ์หนึ่งที่เป็นไปได้สำหรับการเรียงลำดับโดยประมาณดังต่อไปนี้ (*): การให้NNNเป็น∑ivi∑ivi\sum_i v_iสำหรับทุกๆ1≤i≤n1≤i≤n1 \leq i \leq nเราต้องการให้vσ(i)≤N/ivσ(i)≤N/iv_{\sigma(i)} \leq N/i (เช่น "quasi-เรียง "รายการถูกล้อมรอบจากด้านบนโดยฟังก์ชั่นลดลงi↦N/ii↦N/ii \mapsto N/i ) มันง่ายที่จะเห็นว่าการจัดเรียงจริงตรงตามนี้: vσ(2)vσ(2)v_{\sigma(2)}ต้องไม่มากกว่าvσ(1)vσ(1)v_{\sigma(1)}ดังนั้นมันจึงเป็นอย่างมาก(vσ(1)+vσ(2))/2(vσ(1)+vσ(2))/2(v_{\sigma(1)} + v_{\sigma(2)})/2ซึ่ง≤N/2≤N/2\leq N/2และโดยทั่วไปvσ(i)vσ(i)v_{\sigma(i)}จะต้องไม่มากกว่า(∑j≤ivσ(i))/i(∑j≤ivσ(i))/i(\sum_{j \leq i} v_{\sigma(i)})/iซึ่งเป็น≤N/i≤N/i\leq N/iฉัน ตัวอย่างเช่นต้องการ (*) สามารถทำได้โดยอัลกอริทึมด้านล่าง (แนะนำโดย @Louis) คำถามของฉันคือ: …