อัลกอริธึมการเรียงลำดับที่คลุมเครือที่สุดที่คุณรู้คืออะไร [ปิด]


22

ฉันเพิ่งอ่านเกี่ยวกับcyclesortผ่านทางโพสต์บล็อก sortvis.org นี่อาจเป็นสิ่งที่คลุมเครือที่สุดเท่าที่ฉันเคยได้ยินมาเพราะใช้คณิตศาสตร์ที่ฉันไม่คุ้นเคย

อะไรคือสิ่งที่คลุมเครือที่สุดที่คุณรู้


4
จะต้องกลับมาอ่าน
ทำเครื่องหมาย C

ช่วงเวลาที่ดีกับสิ่งนี้คลาสโครงสร้างข้อมูลของฉันเพิ่งเริ่มครอบคลุมประเภทต่างๆ ตอนนี้ไม่เพียง แต่ฉันจะได้รับความเข้าใจในประเภทพื้นฐาน แต่ยังมีคนบ้าด้วย
เจสัน

คำตอบ:



12

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

สิ่งนี้จะชดเชยมันจาก bogosort เพราะในกรณีที่ดีที่สุด bogosort นั้นค่อนข้างมีประสิทธิภาพ - กล่าวคือเมื่ออาร์เรย์ถูกเรียงลำดับแล้ว Slowsort จะไม่“ ทนทุกข์” จากพฤติกรรมที่ดีที่สุด แม้ในกรณีที่ดีที่สุดก็ยังคงมีรันไทม์$ \ โอเมก้า (n ^ \ frac {\ log_2n} {2 + \ epsilon}) $ สำหรับε > 0

นี่คือ pseudocode ของมันดัดแปลงมาจากบทความ Wikipediaภาษาเยอรมัน:

function slowsort(A, i, j):
  if i >= j: return

  m = (i + j) / 2
  slowsort(A, i, m)
  slowsort(A, m + 1, j)

  if A[j] < A[m]:
    swap(A[j], A[m])

  slowsort(A, i, j - 1)

1
Bogosort สามารถทำสิ่งเล็กน้อยได้ดีที่สุดในกรณีที่ดีที่สุดโดยการกลับคำสั่งของขั้นตอน: ก่อนอื่นให้สลับ หากเรียงลำดับแล้วหยุด
Alex Feinman

3
@Alex: ไม่ นั่นไม่เปลี่ยนแปลงอะไรเลย Bogosort จะยังคงเสร็จสิ้นหลังจากขั้นตอนแรกเพราะเมื่อมีโอกาสแล้วการสับจะเรียงลำดับ Bogosort ยังคงแสดงพฤติกรรมที่ดีที่สุดกรณีที่เด่นชัดกับเวลาทำงานที่แตกต่างกันโดยพื้นฐาน (O (n)) จากกรณีที่เลวร้ายที่สุดและกรณีเฉลี่ย Slowsort ไม่มีสิ่งนี้
Konrad Rudolph

อาฉันกำลังคิด แต่เพียงเงื่อนไขเริ่มต้นไม่ใช่เส้นทางการประหารชีวิต!
Alex Feinman

รักสิ่งนี้ :) ไม่เหมือนแรงเดรัจฉาน ...

8

ผมไม่ทราบว่าข้อหานี้เป็นปิดบัง แต่หนึ่งในที่สุดเรียงลำดับไร้สาระ "ขั้นตอนวิธีการ" เป็นBogosort ลิงค์จากหน้า Bogosort ก็สนุกเช่นกัน

และมีอัญมณีนี้จากส่วนที่เกี่ยวกับ "quantum bogo-sort"

เนื้อหาการสร้างจักรวาล2 Nนั้นก็เป็นความทรงจำที่เข้มข้นเช่นกัน

อืม ... คุณพูดได้เลยว่า :-)


ฉันชอบอันนี้ ผมชอบความคิดของ "ควอนตัม bogosort" :-)
คณบดีฮาร์ดิง

6

"อัลกอริทึม" ที่คลุมเครืออีกอย่างคือIntelligent Design Sort - แต่ไม่มีอัลกอริทึมใดที่เร็วกว่าหรือใช้หน่วยความจำน้อยกว่า :)


หนึ่งในคุณสมบัติที่ดีที่สุดของอัลกอริทึมนั้นคือเราเพิ่งรู้ว่ามันใช้งานได้ - ไม่จำเป็นต้องวิเคราะห์หรือพิสูจน์อะไรเลย
คาเลบ


5

ฉันคิดว่าการเรียงลำดับฟองจะเป็นคำตอบที่ไม่ถูกต้องในสถานการณ์นี้เช่นกัน

:)


3

Knuth เล่มที่ 3 1ในคำตอบของแบบฝึกหัดข้อใดข้อหนึ่งให้ใช้งานอัลกอริธึมการเรียงแบบนิรนามซึ่งเป็นพื้นฐานของรหัสกอล์ฟโบราณ - การเรียงลำดับสั้นที่สุดที่คุณสามารถเขียนในภาษาแอสเซมบลี MIX รหัสย่อมาจากราคาที่ซับซ้อนดังนั้น O (N 3 ) ถึงแม้ว่า ...

1อย่างน้อยในรุ่นที่เก่ากว่า จากการแก้ไข MIXAL สำหรับฉบับใหม่ฉันไม่แน่ใจว่ามันยังอยู่หรือไม่


3

สำหรับการเรียนโครงสร้างข้อมูลของฉันฉันได้ไป (อย่างชัดเจน) พิสูจน์ความถูกต้องของสมุนจัดเรียง มันมีเวลาทำงานของ O (n ^ {log 3 / log 1.5}) = O (n ^ 2.7095 ... )


2

ฉันไม่รู้ว่ามันเป็นสิ่งที่คลุมเครือที่สุดหรือไม่ แต่การเรียงตัวของปาเก็ตตี้เป็นหนึ่งในสิ่งที่ดีที่สุดในสถานการณ์ที่คุณสามารถใช้งานได้


นี่เป็นแนวคิดที่คล้ายกันกับ“ การจัดเรียงการนอนหลับ” และน่าสนใจพอที่จะใช้ในชีวสารสนเทศศาสตร์สำหรับการหาลำดับดีเอ็นเอ (การเรียงลำดับ Sanger)
Konrad Rudolph

2

หนึ่งในหนังสือ Knuth ดั้งเดิม "การเรียงลำดับและการค้นหา" มีการพับกึ่งกลางที่อธิบายกระบวนการที่เรียงลำดับไฟล์เทปโดยไม่ใช้ฮาร์ดดิสก์ ฉันคิดว่ามันใช้เทปไดรฟ์หกตัวและแสดงให้เห็นอย่างชัดเจนว่าเมื่อแต่ละไฟล์ถูกอ่านไปข้างหน้าอ่านย้อนกลับกรอกลับหรือไม่ได้ใช้งาน วันนี้มันเป็นอนุสาวรีย์ของเทคโนโลยีที่ล้าสมัย


1

ฉันเคยลงทะเบียนในการจัดเรียงฟองเวกเตอร์ในแอสเซมเบลอร์ CRAY เครื่องมีคำสั่งเลื่อนคู่ซึ่งอนุญาตให้คุณเลื่อนเนื้อหาของเวกเตอร์ลงทะเบียนขึ้น / ลงหนึ่งคำ ใส่ทุกจุดลงในเวกเตอร์สองตัวจากนั้นคุณสามารถเรียงลำดับฟองเต็มโดยไม่ต้องทำการอ้างอิงหน่วยความจำอื่นจนกว่าคุณจะเสร็จสิ้น ยกเว้นการเรียงลำดับฟองแบบ N ** 2 มันมีประสิทธิภาพ

ฉันยังจำเป็นต้องทำการจัดเรียงจุดลอยตัวของความยาว 4 เวกเตอร์เร็วที่สุดเท่าที่จะทำได้สำหรับการเรียงลำดับเดียว ทำได้โดยการค้นหาตาราง (เครื่องหมายบิตของ A2-A1 คือหนึ่งบิต, เครื่องหมายของ A3-A1 เป็นอีกบิตหนึ่ง ... , จากนั้นคุณค้นหาเวกเตอร์การเปลี่ยนแปลงในตารางมันเป็นวิธีแก้ปัญหาที่เร็วที่สุดที่ฉันสามารถหาได้ ด้วยการใช้งานไม่ได้กับสถาปัตยกรรมสมัยใหม่แม้ว่าหน่วยลอยและจำนวนเต็มจะถูกแยกออกจากกันเกินไป


คุณยังมีแหล่งที่มาสำหรับสิ่งนี้หรือไม่? ฉันสนใจที่จะลองดู!
sova

ไม่มีแหล่งที่มามันเป็นเครื่องจักรที่ไม่ล้าสมัยสำหรับ บริษัท ที่เลิกจ้างฉันในที่สุด การค้นหาตารางไม่ยาก: sb1 = 1 & ((a2-a1) >> 63); sb2 = 2 & ((a3-a1) >> 62); ... index = sb1 | sb2 | sb3 ... ได้ติดตาม โดยการค้นหาตารางของคำสั่ง
Omega Centauri

1

Google Code Jam มีปัญหาเกี่ยวกับอัลกอริทึมที่เรียกว่า Gorosort ซึ่งฉันคิดว่าพวกเขาคิดค้นปัญหาขึ้นมา

Goro มี 4 แขน Goro แข็งแกร่งมาก คุณไม่ยุ่งกับ Goro Goro ต้องเรียงลำดับอาร์เรย์ของจำนวนเต็ม N ตัวที่แตกต่างกัน อัลกอริธึมไม่ใช่จุดแข็งของ Goro ความแข็งแกร่งคือความแข็งแกร่งของ Goro แผนการของ Goro คือการใช้นิ้วมือทั้งสองในมือเพื่อจับองค์ประกอบหลายอย่างของอาเรย์แล้วกดที่โต๊ะด้วยหมัดที่สามและสี่ของเขาให้มากที่สุด สิ่งนี้จะทำให้องค์ประกอบที่ไม่มีความปลอดภัยของอาเรย์บินขึ้นไปในอากาศสับแบบสุ่มและถอยกลับลงไปในตำแหน่งอาเรย์ที่ว่างเปล่า

http://code.google.com/codejam/contest/dashboard?c=975485#s=p3


0

อย่าจำชื่อ แต่โดยทั่วไปแล้ว

while Array not sorted

  rearrange the array in a random order

นี่คือโบกอร์กล่าวถึงในคำตอบอื่น ๆ
MatrixFrog

0

เรียงเปลือก

บางทีอัลกอริทึมนั้นอาจไม่ชัดเจน แต่ใครสามารถตั้งชื่อการนำไปใช้ที่จริงแล้วใช้จริง ฉันสามารถ!

TIGCC (คอมไพเลอร์ที่ใช้ GCC สำหรับเครื่องคิดเลขกราฟ TI-89/92 / V200) ใช้การจัดเรียงเชลล์สำหรับqsortการนำไปใช้ในไลบรารีมาตรฐาน:

__ATTR_LIB_C__ void qsort(void *list, short num_items, short size, compare_t cmp_func)
{
  unsigned short gap,byte_gap,i,j;                
  char *p,*a,*b,temp;                       
  for (gap=((unsigned short)num_items)>>1; gap>0; gap>>=1)    // Yes, this is not a quicksort,
    {                                                         // but works fast enough...    
      byte_gap=gap*(unsigned short)size;
      for(i=byte_gap; i<((unsigned short)num_items)*(unsigned short)size; i+=size)
        for(p=(char*)list+i-byte_gap; p>=(char*)list; p-= byte_gap)
          {
            a=p; b=p+byte_gap;
            if(cmp_func(a,b)<=0) break;
            for(j=size;j;j--)
              temp=*a, *a++=*b, *b++=temp;
          }
    }
}

การเรียงลำดับของเชลล์ได้รับการเลือกเพื่อสนับสนุน quicksort เพื่อให้ขนาดรหัสต่ำ แม้ว่าความซับซ้อนเชิงซีกจะแย่กว่านั้น TI-89 ไม่มี RAM ทั้งหมด (190K ลบขนาดโปรแกรมและขนาดทั้งหมดของตัวแปรที่ไม่ได้เก็บถาวร) ดังนั้นจึงค่อนข้างปลอดภัยที่จะสมมติว่าจำนวนรายการจะ ใจต่ำ

การเขียนที่ใช้งานได้เร็วขึ้นหลังจากที่ฉันบ่นว่ามันช้าเกินไปในโปรแกรมที่ฉันเขียน มันใช้ขนาดช่องว่างที่ดีกว่าพร้อมกับการเพิ่มประสิทธิภาพการชุมนุม สามารถพบได้ที่นี่: qsort.c

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