หมายเหตุเกี่ยวกับวิธีการ
ฉันคิดเล็กน้อยเกี่ยวกับปัญหานี้และหาทางแก้ไข เมื่อฉันอ่านคำตอบของ Saeed Amiriฉันรู้ว่าสิ่งที่ฉันคิดขึ้นมาคือรุ่นพิเศษของขั้นตอนการหาลำดับเบสมาตรฐานที่ยาวที่สุดสำหรับลำดับความยาว 3 ฉันโพสต์วิธีที่ฉันคิดวิธีแก้ปัญหาเพราะฉันคิดว่า เป็นตัวอย่างที่น่าสนใจในการแก้ปัญหา
รุ่นสององค์ประกอบ
ขอเริ่มต้นเล็ก ๆ แทนการมองหาสามดัชนีที่องค์ประกอบอยู่ในลำดับที่ดูให้ของสอง:ดังกล่าวว่า[เจ]A [ i ] < A [ j ]i<jA[i]<A[j]
ถ้ากำลังลดลง (เช่นหรือเทียบเท่า ) ดังนั้นไม่มีดัชนีดังกล่าว มิฉะนั้นมีดัชนีเช่นว่า1]A∀i<j,A[i]≥A[j]∀i,A[i]≥A[i+1]iA[i]<A[i+1]
กรณีนี้ง่ายมาก เราจะพยายามพูดคุยกัน มันแสดงให้เห็นว่าปัญหาตามที่ระบุไม่สามารถแก้ไขได้: ดัชนีที่ร้องขอไม่ได้มีอยู่เสมอ ดังนั้นเราค่อนข้างจะถามว่าอัลกอริทึมจะส่งกลับดัชนีที่ถูกต้องหากมีอยู่หรืออ้างอย่างถูกต้องว่าไม่มีดัชนีดังกล่าว
เกิดขึ้นกับอัลกอริทึม
ฉันจะใช้ระยะsubsequenceหมายถึงสารสกัดจาก array ประกอบด้วยดัชนีที่ไม่อาจจะติดต่อกัน (กับ ) และเรียกใช้ค่าเฉลี่ย องค์ประกอบต่อเนื่องของ ( )A(A[i1],…,A[im])i1<⋯<imA(A[i],A[i+1],…,A[i+m−1])
เราเพิ่งเห็นว่าดัชนีที่ร้องขอนั้นไม่มีอยู่จริง กลยุทธ์ของเราคือการศึกษาเมื่อไม่มีดัชนี เราจะทำเช่นนี้โดยสมมติว่าเราพยายามค้นหาดัชนีและดูว่าการค้นหาของเราอาจผิดพลาดอย่างไร จากนั้นกรณีที่การค้นหาไม่ผิดพลาดจะมีอัลกอริทึมในการค้นหาดัชนี
ด้วยสองดัชนีเราสามารถหาดัชนีติดต่อกัน กับสามดัชนีที่เราอาจจะไม่สามารถที่จะเกิดขึ้นกับและ 1 อย่างไรก็ตามเราสามารถพิจารณากรณีที่มีองค์ประกอบสามอย่างที่เพิ่มขึ้นอย่างเข้มงวด ( ) ได้รับการแก้ไขเนื่องจากง่ายต่อการรับรู้การวิ่งดังกล่าว และดูว่าสภาพนี้อาจไม่เป็นไปตามเงื่อนไข สมมติว่าลำดับไม่มีการเพิ่มความยาวของการรัน 3 อย่างเคร่งครัดj=i+1k=j+1A[i]<A[i+1]<A[i+2]
ลำดับมีการเพิ่มความยาว 2 อย่างเคร่งครัดเท่านั้น (ซึ่งฉันจะเรียกลำดับคู่สั้น ๆ ) โดยคั่นด้วยความยาวที่ลดลงอย่างน้อย 2 เพื่อให้การรันเพิ่มขึ้นอย่างเข้มงวดเพื่อเป็นส่วนหนึ่งของการเพิ่มลำดับ 3 องค์ประกอบที่จะต้องมีองค์ประกอบที่ก่อนหน้านี้เช่นว่าหรือเป็นองค์ประกอบในภายหลังดังกล่าวว่า[k]A[j]<A[j+1]iA[i]<A[j]kA[j+1]<A[k]
กรณีที่ไม่มีทั้งและคือเมื่อแต่ละคู่ที่สั่งซื้อต่ำกว่าคู่ต่อไปทั้งหมด นี่ไม่ใช่ทั้งหมด: เมื่อทั้งคู่เชื่อมโยงกันเราจำเป็นต้องเปรียบเทียบพวกมันให้ละเอียดยิ่งขึ้นik
องค์ประกอบทางด้านซ้ายสุดของความต้องการที่เพิ่มขึ้น subsequence ที่จะมาในช่วงต้นและจะมีขนาดเล็ก องค์ประกอบต่อไปจะต้องมีขนาดใหญ่ แต่มีขนาดเล็กที่สุดเท่าที่จะสามารถที่จะหาหนึ่งในสามองค์ประกอบขนาดใหญ่kองค์ประกอบแรกที่ไม่ได้เป็นองค์ประกอบที่เล็กที่สุดในลำดับและมันก็ไม่ได้เป็นครั้งแรกที่มีองค์ประกอบที่มีขนาดใหญ่ตามมา - บางครั้งมีองค์ประกอบที่ต่ำกว่า 2 องค์ประกอบต่อไปและบางครั้งก็มีดีกว่า เหมาะสำหรับขั้นต่ำที่พบแล้วijki
ไปจากซ้ายไปขวาเราลังเลเลือกองค์ประกอบที่เล็กเป็นฉันหากเราพบเป็นองค์ประกอบที่มีขนาดใหญ่ที่เหมาะสมต่อไปเราเลือกคู่นี้เป็นเบื้องต้นj) หากเราพบยิ่งใหญ่กว่าเราจะชนะ สิ่งสำคัญที่ควรทราบคือตัวเลือกและตัวเลือกของเราได้รับการอัปเดตอย่างอิสระ: หากเรามีผู้สมัครและเราพบว่าเช่นนั้น ,จะเป็นผู้สมัครคนต่อไปแต่ยังคงอยู่ เฉพาะในกรณีที่เราพบเช่นที่จะi(i,j)ki(i,j)(i,j)i′>jA[i′]<A[i]i′i(i,j)j′A[j′]<A[j](i′,j′) กลายเป็นคู่สมัครใหม่
คำชี้แจงของอัลกอริทึม
ให้ไว้ในไวยากรณ์ของ Python แต่ระวังว่าฉันยังไม่ได้ทดสอบ
def subsequence3(A):
"""Return the indices of a subsequence of length 3, or None if there is none."""
index1 = None; value1 = None
index2 = None; value2 = None
for i in range(0,len(A)):
if index1 == None or A[i] < value1:
index1 = i; value1 = A[i]
else if A[i] == value1: pass
else if index2 == None:
index2 = (index1, i); value2 = (value1, A[i])
else if A[i] < value2[1]:
index2[1] = i; value2[1] = A[i]
else if A[i] > value2[1]:
return (index2[0], index2[1], i)
return None
ร่างหลักฐาน
index1
เป็นดัชนีขั้นต่ำของส่วนหนึ่งของอาร์เรย์ที่ผ่านไปแล้ว (หากเกิดขึ้นหลายครั้งเราจะยังคงเกิดขึ้นครั้งแรก) หรือNone
ก่อนที่จะประมวลผลองค์ประกอบแรก index2
เก็บดัชนีของความยาวที่เพิ่มขึ้นของลำดับที่ 2 ในส่วนที่สำรวจแล้วซึ่งมีองค์ประกอบที่ใหญ่ที่สุดต่ำสุดหรือNone
หากไม่มีลำดับดังกล่าว
เมื่อreturn (index2[0], index2[1], i)
วิ่งเรามีvalue2[0] < value[1]
(นี่คือค่าคงที่value2
) และvalue[1] < A[i]
(ชัดเจนจากบริบท) ถ้าลูปจบลงโดยไม่ต้องเรียกคืนก่อนหน้าเช่นvalue1 == None
ในกรณีที่ไม่มีการเพิ่มความยาวของลำดับที่ 2 ให้อยู่คนเดียว 3 หรือvalue1
เพิ่มการเรียงตัวของความยาวที่ 2 ซึ่งมีองค์ประกอบที่ใหญ่ที่สุดที่ต่ำที่สุด ในกรณีหลังนี้เรายิ่งมีค่าคงที่ไม่มี subsequence ที่เพิ่มขึ้นของความยาว 3 สิ้นสุดลงก่อนหน้านี้กว่าvalue1
; ดังนั้นองค์ประกอบสุดท้ายของการเรียงลำดับใด ๆ ที่เพิ่มเข้ามาvalue2
จะกลายเป็นการรวมกันที่เพิ่มขึ้นของความยาว 3: เนื่องจากเรายังมีค่าคงที่ที่value2
ไม่ได้เป็นส่วนหนึ่งของการเพิ่มขึ้นของความยาว 3 ที่มีอยู่ในส่วนที่ ไม่มีการเรียงลำดับดังกล่าวในอาร์เรย์ทั้งหมด
การพิสูจน์ค่าคงที่ดังกล่าวถูกทิ้งไว้เป็นแบบฝึกหัดสำหรับผู้อ่าน
ความซับซ้อน
เราใช้หน่วยความจำเพิ่มเติมและสำรวจอาร์เรย์เป็นสตรีมจากซ้ายไปขวา เราดำเนินการการประมวลผลสำหรับแต่ละองค์ประกอบที่นำไปสู่การทำงานของเวลา(n)O ( 1 ) O ( n )O(1)O(1)O(n)
หลักฐานทางการ
ทิ้งไว้เป็นแบบฝึกหัดให้กับผู้อ่าน