ฉันสงสัยว่ามีวิธีมาตรฐานในการวัด "sortness" ของอาร์เรย์หรือไม่? อาเรย์ที่มีจำนวนค่ามัธยฐานของค่าการรุกรานที่เป็นไปได้จะถือว่าไม่ได้เรียงลำดับสูงสุดหรือไม่ โดยที่ฉันหมายความว่ามันเป็นพื้นเท่าที่จะทำได้จากการเรียงลำดับหรือเรียงกลับกัน
ฉันสงสัยว่ามีวิธีมาตรฐานในการวัด "sortness" ของอาร์เรย์หรือไม่? อาเรย์ที่มีจำนวนค่ามัธยฐานของค่าการรุกรานที่เป็นไปได้จะถือว่าไม่ได้เรียงลำดับสูงสุดหรือไม่ โดยที่ฉันหมายความว่ามันเป็นพื้นเท่าที่จะทำได้จากการเรียงลำดับหรือเรียงกลับกัน
คำตอบ:
ไม่ขึ้นอยู่กับใบสมัครของคุณ มาตรการของการเรียงลำดับมักถูกอ้างถึงว่าเป็นมาตรการของความยุ่งเหยิงซึ่งทำหน้าที่ตั้งแต่ถึงRโดยที่N < Nคือชุดของลำดับที่แน่นอนทั้งหมดของจำนวนเต็ม nonnegative ที่แตกต่างกันอย่างชัดเจน การสำรวจโดย Estivill-Castro and Wood [1] รายการและอภิปราย 11 มาตรการที่แตกต่างของความผิดปกติในบริบทของอัลกอริทึมการเรียงลำดับแบบปรับตัว
จำนวนผู้รุกรานอาจใช้งานได้ในบางกรณี แต่บางครั้งก็ไม่เพียงพอ ตัวอย่างที่ให้ไว้ใน [1] คือลำดับ
ที่มีจำนวน inversions เป็นกำลังสอง แต่ประกอบด้วยการวิ่งขึ้นไปสองครั้งเท่านั้น มันเกือบจะถูกจัดเรียงแล้ว แต่สิ่งนี้ไม่ถูกดักจับโดยผู้รุกราน
Mannila [1] axiomatizes presortedness (โดยมุ่งเน้นไปที่อัลกอริธึมที่ใช้การเปรียบเทียบ) ดังนี้ (การถอดความ)
ให้ชุดที่สั่งซื้อทั้งหมด จากนั้นทำแผนที่เมตรจากΣ ⋆ (ลำดับขององค์ประกอบที่แตกต่างจากΣ ) เพื่อธรรมชาติเป็นตัวชี้วัดของ presortednessถ้ามันตอบสนองด้านล่างเงื่อนไข
ถ้าจะเรียงลำดับจากนั้นม. ( X ) = 0
ถ้ากับX = x 1 ... x n , Y = Y 1 ... Y n และx ฉันสำหรับทั้งหมด i , j ∈ [ 1 .. n ] , จากนั้น m ( X ) = m ( Y ) )
ถ้าเป็น subsequence ของY ∈ Σ ⋆แล้วm ( X ) ≤ เมตร( Y )
ถ้าสำหรับทุกคนที่ฉัน∈ [ 1 .. | | X | ]และj ∈ [ 1 .. | Y | ]สำหรับบาง X , Y ∈ Σ ⋆แล้วม. ( X ⋅ Y ) ≤ เมตร( X ) + M ( Y )
สำหรับทุก X ∈ Σ ⋆และ ∈ E ∖ X
ตัวอย่างของมาตรการดังกล่าว ได้แก่
โปรดทราบว่ามีการกำหนดการแจกแจงแบบสุ่มโดยใช้มาตรการเหล่านี้เช่นทำให้ลำดับที่เรียงมากขึ้นหรือน้อยลงมีโอกาสมากขึ้น สิ่งเหล่านี้เรียกว่าการแจกแจงแบบ Ewens [2, Ch. 4-5; 3 ตัวอย่าง 12; 4], กรณีพิเศษที่เรียกว่าการกระจายมัลโล น้ำหนักเป็นพารามิเตอร์ในค่าคงที่และปฏิบัติตาม
)
สังเกตวิธีที่กำหนดการแจกแจงแบบเดียวกัน (สำหรับmทั้งหมด)
เนื่องจากมีความเป็นไปได้ที่จะสุ่มตัวอย่างวิธีการวัดค่าเหล่านี้ได้อย่างมีประสิทธิภาพร่างของงานนี้จึงมีประโยชน์ในทางปฏิบัติเมื่อขั้นตอนวิธีการเรียงลำดับการเปรียบเทียบ
ฉันมีคำจำกัดความของตัวเองของ "เรียงลำดับ" ของลำดับ
กำหนดลำดับใด ๆ [a, b, c, …] เราเปรียบเทียบกับลำดับที่เรียงลำดับที่มีองค์ประกอบเดียวกันนับจำนวนการแข่งขันและหารด้วยจำนวนองค์ประกอบในลำดับ
ตัวอย่างเช่นลำดับที่กำหนด[5,1,2,3,4]
เราดำเนินการดังนี้:
1) เรียงลำดับ: [1,2,3,4,5]
2) เปรียบเทียบลำดับที่เรียงลำดับกับต้นฉบับโดยการย้ายทีละตำแหน่งและนับจำนวนการแข่งขันสูงสุด:
[5,1,2,3,4]
[1,2,3,4,5] one match
[5,1,2,3,4]
[1,2,3,4,5] no matches
[5,1,2,3,4]
[1,2,3,4,5] no matches
[5,1,2,3,4]
[1,2,3,4,5] no matches
[5,1,2,3,4]
[1,2,3,4,5] no matches
[5,1,2,3,4]
[1,2,3,4,5] 4 matches
[5,1,2,3,4]
[1,2,3,4,5] no matches
...
[5,1,2,3,4]
[1,2,3,4,5] no matches
3) จำนวนการจับคู่สูงสุดคือ 4 เราสามารถคำนวณ "sortness" เป็น 4/5 = 0.8
ความเรียงของลำดับที่เรียงจะเป็น 1 และความเรียงของลำดับที่มีองค์ประกอบที่อยู่ในลำดับที่กลับกันจะเป็น 1 / n
แนวคิดเบื้องหลังคำจำกัดความนี้คือการประมาณจำนวนงานที่น้อยที่สุดที่เราต้องทำเพื่อแปลงลำดับใด ๆ ให้เป็นลำดับที่เรียงลำดับ ในตัวอย่างด้านบนเราต้องการย้ายเพียงองค์ประกอบเดียว 5 รายการ (มีหลายวิธี แต่การย้าย 5 มีประสิทธิภาพมากที่สุด) เมื่อองค์ประกอบจะถูกวางในลำดับกลับกันเราจะต้องย้ายองค์ประกอบ 4 และเมื่อเรียงลำดับแล้วไม่จำเป็นต้องทำงาน
ฉันหวังว่าคำจำกัดความของฉันเหมาะสม
หากคุณต้องการบางสิ่งที่รวดเร็วและสกปรก (สัญญาณสรุปทำให้ตกใจฉัน) ฉันเขียนฟังก์ชันความผิดปกติแบบง่ายสุดใน C ++ สำหรับ Class ชื่อ Array ซึ่งสร้างอาร์เรย์ int ที่เต็มไปด้วยตัวเลขที่สร้างแบบสุ่ม:
void Array::disorder() {
double disorderValue = 0;
int counter = this->arraySize;
for (int n = 0; n < this->arraySize; n++) {
disorderValue += abs(((n + 1) - array[n]));
// cout << "disorderValue variable test value = " << disorderValue << endl;
counter++;
}
cout << "Disorder Value = " << (disorderValue / this->arraySize) / (this->arraySize / 2) << "\n" << endl;
}
ฟังก์ชันจะเปรียบเทียบค่าในแต่ละองค์ประกอบกับดัชนีขององค์ประกอบ + 1 เพื่อให้อาร์เรย์ในลำดับย้อนกลับมีค่าความยุ่งเหยิงเป็น 1 และอาร์เรย์ที่เรียงลำดับมีค่าความยุ่งเหยิงเป็น 0 ไม่ซับซ้อน แต่ทำงานอยู่
ไมเคิล