อัลกอริทึมไร้เดียงสาสำหรับการพิจารณา B จาก A:
สำหรับ k=1,…,nกำหนดค่าของ B(k) โดยเปรียบเทียบกัน A(i) ถึง A(k) สำหรับ
i=1,…,k และนับคนที่พอใจ A(i)<A(k).
อัลกอริทึมนี้เปรียบเทียบ A(1) ถึงคนอื่น ๆ (n−1 ครั้ง) A(2) ถึง n−2 อื่น ๆ เป็นต้นจำนวนการเปรียบเทียบทั้งหมดคือ (n−1)(n−2)2. แต่นั่นไม่ใช่สิ่งที่ดีที่สุดที่เราทำได้ ตัวอย่างเช่นมองไปที่B(n)เราไม่ต้องทำการเปรียบเทียบใด ๆ ! B ( n )=A(n)−1เพราะมันเป็นครั้งแรก n ตัวเลขธรรมชาติและมันรับประกัน (โดยไม่คำนึงถึงการเปลี่ยนแปลง) ว่า n−1ตัวเลขธรรมชาติที่ต่ำกว่าจะอยู่ที่นั่น เกี่ยวกับอะไรB(n−1)? แทนที่จะตรวจสอบA(1) ตลอด A(n−2)เราสามารถตรวจสอบได้ A(n). นั่นคือ:
สำหรับ k=1,…,n2ใช้อัลกอริทึมด้านบน สำหรับ
k=n2, … , n ใช้อัลกอริทึมย้อนกลับ: ตรวจสอบ B ( k ) โดยการตั้งค่าเริ่มต้นเป็น A(n)−1 แล้วลบออก 1 สำหรับแต่ละรายการ A(i) สำหรับ i=k+1,…,n ที่น้อยกว่า A(k).
สิ่งนี้จะใช้เวลา 2×(n2−1)(n2−2)2=(n−2)(n−4)4 ขั้นตอนซึ่งยังคงอยู่ O(n2). โปรดทราบว่าในการสร้างA จาก Bถ้า B(n)=A(n)−1 แล้วก็ A(n)=B(n)+1.
แต่ตอนนี้สำหรับกลเม็ดเด็ดพรายมากขึ้น หากเราอนุญาตพื้นที่เพิ่มเติมหรือเรียงลำดับเราสามารถจัดเรียงตัวเลขเมื่อเราทำการเปรียบเทียบ ตัวอย่างเช่น:
∣∣∣∣ASB8904803701407332219166655∣∣∣∣
แทนที่จะตรวจสอบทั้งหมด (หรือตรวจสอบตามลำดับ) เราสามารถใช้การค้นหาแบบไบนารี่เพื่อตรวจสอบแต่ละรายการ B(k). อย่างไรก็ตามการเรียงลำดับยังคงต้องใช้เวลาO(nlogn).