การสแกนเชิงเส้นเป็นวิธีที่ดีที่สุดที่ฉันรู้ว่าจะต้องทำอย่างไรหากชุดนั้นแสดงเป็นรายการเชื่อมโยงที่เรียงลำดับ เวลาทำงานเป็น )O ( | A | + | B | )
โปรดทราบว่าคุณไม่จำเป็นต้องเปรียบเทียบทุกองค์ประกอบของกับทุกองค์ประกอบของBตามลำดับ นั่นจะนำไปสู่รันไทม์ของO ( | A | × | B | )ซึ่งแย่กว่ามาก คุณสามารถใช้เทคนิคที่คล้ายกับการดำเนินการ "ผสาน" ในการผสานการปรับเปลี่ยนที่เหมาะสมเพื่อละเว้นค่าที่ใช้ร่วมกันสำหรับทั้งสองชุดแทนABO ( | A | × | B | )
ในรายละเอียดเพิ่มเติมคุณสามารถสร้างอัลกอริทึมแบบเรียกซ้ำดังต่อไปนี้เพื่อคำนวณโดยสมมติว่าAและBแสดงเป็นรายการที่เชื่อมโยงกับค่าในลำดับที่เรียงลำดับ:A ∖ BAB
difference(A, B):
if len(B)=0:
return A # return the leftover list
if len(A)=0:
return B # return the leftover list
if A[0] < B[0]:
return [A[0]] + difference(A[1:], B)
elsif A[0] = B[0]:
return difference(A[1:], B[1:]) # omit the common element
else:
return [B[0]] + difference(A, B[1:])
ฉันได้แสดงสิ่งนี้ในหลอก -Python หากคุณไม่ได้อ่านหลามA[0]
เป็นหัวหน้าของรายการที่เชื่อมโยงA
, A[1:]
ส่วนที่เหลือของรายการและ+
แสดงให้เห็นถึงการเรียงต่อกันของรายการ สำหรับเหตุผลด้านประสิทธิภาพหากคุณทำงานใน Python คุณอาจไม่ต้องการนำไปใช้ตามที่ระบุไว้ข้างต้นตัวอย่างเช่นอาจใช้เครื่องกำเนิดไฟฟ้าได้ดีกว่าเพื่อหลีกเลี่ยงการสร้างรายการชั่วคราวจำนวนมาก - แต่ฉันต้องการ แสดงแนวคิดในรูปแบบที่ง่ายที่สุด รหัสหลอกนี้มีวัตถุประสงค์เพื่อแสดงให้เห็นถึงอัลกอริทึมไม่ใช่เสนอการใช้งานที่เป็นรูปธรรม
ABAB