เวลาในการเรียงลำดับอาเรย์จะเปลี่ยนแปลงอย่างมากใน Java ตามขนาด Gap ได้อย่างไร

โดยทั่วไปฉันสร้างอาร์เรย์สุ่ม 10 อาร์เรย์จากขนาด: 8000,16000,32000,64000,128000,256000

สิ่งที่ฉันหมายถึงคือฉันมี 10 อาร์เรย์ขนาด 8000, 10 อาร์เรย์ขนาด 16000 ฯลฯ

ทั้งหมดนี้เต็มไปด้วยตัวเลขสุ่มตั้งแต่ 0 ถึงขนาดอาร์เรย์

ฉันมีการใช้งานสำหรับการเรียงลำดับเชลล์:

public static void sortMyArray(int[] a){
for (int gap = a.length / 2; gap > 0; gap = (gap / 2)) {
    for (int i = gap; i < a.length; i++) {
        int tmp = a[i];
        int j = i;
        for (; j >= gap && tmp < (a[j - gap]); j -= gap) {
            a[j] = a[j - gap];
        }
        a[j] = tmp;
     }
}
}

เมื่อช่องว่างคือ gap = a.length / a ความยาว ฉันแค่มีการเรียงลำดับการแทรก ต่อไปนี้เป็นเวลาในการจัดเรียงอาร์เรย์เหล่านี้:

Number of Elements  Milliseconds
8000                13
16000               53
32000               217
64000               828
128000              3311
256000              13352

นี่ก็คือประมาณ O(N^2) เมื่อจำนวนองค์ประกอบเพิ่มขึ้นเป็นสองเท่า เวลาในการแก้ไขจะเพิ่มขึ้นเกือบ 4 เท่า

อย่างไรก็ตาม เมื่อฉันใช้ gap = a.length / 2 ฉันได้รับค่าเช่น:

Number of Elements  Milliseconds
8000                2
16000               2
32000               4
64000               10
128000              25
256000              60

นี่ยังดีกว่า O(N) เหรอ? สิ่งนี้เป็นไปได้อย่างไร? ฉันพยายามปิดโปรเซสเซอร์จาก Windows และลองใช้คอมพิวเตอร์โดยใช้โปรเซสเซอร์เพียง 1 ตัวเท่านั้น แต่ค่าต่างๆ ยังคงไม่สมเหตุสมผล

นี่คือรหัสเต็มของฉันหากคุณสนใจ:

int[] arraySizes = new int[]{8000,16000,32000,64000,128000,256000};
Random rn = new Random(1);

for(int i=0;i<arraySizes.length;i++){
    int[] arrayToBeSorted = new int[arraySizes[i]];
    System.out.println("Solving array with: " + arraySizes[i] + " elements with first sorting algorithm.");
    for (int c = 0; c < 10; c++) {
        for(int t=0;t<arraySizes[i];t++){
            int randomNumber = rn.nextInt(arrayToBeSorted.length);
            arrayToBeSorted[t] = randomNumber;
        }
        Long initialTime = (new Date().getTime());
        sortMyArray(arrayToBeSorted);
        Long finalTime = (new Date().getTime());
        System.out.println("Time in milliseconds:" + (finalTime - initialTime));
    }
}

person Koray Tugay    schedule 15.05.2013    source แหล่งที่มา
comment
สุ่ม rn = สุ่มใหม่ (1); ดูเหมือนว่าจะน่าสงสัย เพียงใช้ค่าเริ่มต้น Random rn = new Random(); หรือใส่เมล็ดสุ่มขนาดใหญ่เช่น Random rn = new Random(730495);   -  person tgkprog    schedule 16.05.2013
comment
เมล็ดมีผลอย่างไรเหตุใดจึงน่าสงสัย?   -  person Koray Tugay    schedule 16.05.2013
comment
ฉันไม่รู้เกี่ยวกับเครื่องกำเนิดไฟฟ้าแบบสุ่มเพียงพอ แต่เมล็ดพืชเป็นสิ่งสำคัญคือสิ่งที่ฉันอ่าน ฉันสร้างแอปตัวอย่าง แต่สำหรับฉัน เวลาไม่เปลี่ยนแปลง - การแก้อาร์เรย์ด้วย: 256,000 องค์ประกอบด้วยอัลกอริธึมการเรียงลำดับครั้งแรก เวลาเป็นมิลลิวินาที: 213 (รับ 207 ถึง 223 เสมอ) สำหรับ gap = a.length และ gap = a.length / 2   -  person tgkprog    schedule 16.05.2013
comment
โปรดทราบว่าการใช้เมล็ดคงที่จะทำให้ผลลัพธ์มีอคติต่อลำดับตัวเลขที่สร้างโดยเมล็ด   -  person nhahtdh    schedule 16.05.2013


คำตอบ (1)


แม้ว่าการใช้งานของคุณดูเหมือนจะถูกต้อง แต่สมมติฐานของคุณกลับไม่เป็นเช่นนั้น

คุณสันนิษฐานว่าหากฟังก์ชันมีความซับซ้อน O(n^2) และเวลาทำงาน 3311 วินาที ฟังก์ชันอื่นที่มีความซับซ้อน O(n) ควรทำงานประมาณ 57 วินาทีบนข้อมูลเดียวกัน

อย่างไรก็ตาม สัญลักษณ์ O ขนาดใหญ่จะให้แนวคิดเกี่ยวกับอัตราการเติบโตของฟังก์ชัน ไม่ใช่เวลาทำงานจริง ดังนั้นคุณจึงไม่สามารถเปรียบเทียบเวลาการทำงานของฟังก์ชันต่างๆ ตามอัตราการเติบโตได้

person bsrykt    schedule 16.05.2013
comment
สวัสดี สิ่งที่ฉันต้องการจะพูดก็คือ ในการ Insertion Sort เมื่อขนาดอาร์เรย์เพิ่มขึ้นเป็นทวีคูณของ 2 เวลาในการทำงานจะเพิ่มขึ้นอีกระดับ 4 ดังนั้นเวลาในการรันจึงขึ้นอยู่กับจำนวนกำลังสองขององค์ประกอบในอาร์เรย์ อย่างไรก็ตาม เมื่อขนาดช่องว่างเท่ากับ 2 เมื่อจำนวนองค์ประกอบในอาร์เรย์เพิ่มขึ้นเป็นสองเท่า เวลาในการทำงานก็จะเพิ่มขึ้นเป็นสองเท่าตามลำดับ - person Koray Tugay; 16.05.2013
comment
คุณหมายถึงอะไรเมื่อขนาดช่องว่างเท่ากับ 2? - person bsrykt; 16.05.2013
comment
ขออภัย a.length / 2 ฉันหมายถึง ขนาดช่องว่างเท่ากับครึ่งหนึ่งของอาร์เรย์ .. ในสถานการณ์การเรียงลำดับแบบเฉือน - person Koray Tugay; 16.05.2013
comment
สิ่งนี้ไม่ถูกต้อง: เมื่อจำนวนองค์ประกอบในอาร์เรย์เพิ่มขึ้นเป็นสองเท่า เวลาในการทำงานก็จะเพิ่มขึ้นเป็นสองเท่าตามลำดับ 60/25 = 2.4, 25/10 = 2.5 เป็นต้น - person bsrykt; 16.05.2013