วิธีที่เร็วที่สุดในการลบรายการที่ซ้ำกันในรายการคำศัพท์ขนาดใหญ่?


14

ฉันต้องทำรายการคำซ้ำให้ซ้ำซ้อน ฉันลองใช้หลายคำสั่งและทำการวิจัยที่นี่และที่นี่ซึ่งพวกเขาอธิบายว่าวิธีที่เร็วที่สุดในการขจัดความซ้ำซ้อนของรายการคำดูเหมือนจะใช้ awk

awk -> O (n)? จัดเรียง -> O (n บันทึก n)?

อย่างไรก็ตามฉันพบว่าสิ่งนี้ดูเหมือนจะไม่เป็นความจริง นี่คือผลการทดสอบของฉัน:

sort -u input.txt -o output.txt 

จริง 0m12.446s
ผู้ใช้ 0m11.347s
sys 0m0.906s

awk '!x[$0]++' input.txt > output.txt


ผู้ใช้0m47.221s จริง0m45.419s
sys 0m1.260s

ดังนั้นการใช้ sort -u จึงเร็วกว่า 3.7 เท่า ทำไมนี้ มีวิธีที่เร็วยิ่งขึ้นในการทำซ้ำซ้อน?

*********** อัปเดต ********

เมื่อมีคนชี้ให้เห็นในความคิดเห็นอาจเป็นไปได้ว่ารายการคำศัพท์ของฉันเรียงลำดับแล้วบ้าง เพื่อแยกความเป็นไปได้นี้ฉันสร้าง wordlist สองรายการโดยใช้สคริปต์ pythonนี้

List1 = 7 Mb
List2 = 690 Mb

ผลการค้นหา awk:
List1
จริง 0m1.643s
0m1.565s ผู้ใช้
SYS 0m0.062s

List2
จริง 2m6.918s
ผู้ใช้ 2m4.499s
sys 0m1.345s

ผลการเรียงลำดับ:
List1
จริง 0m0.724s
ผู้ใช้ 0m0.666s
sys 0m0.048s

List2
จริง 1m27.254s
ผู้ใช้ 1m25.013s
sys 0m1.251s


เป็นไปได้ไหมว่าข้อมูลที่คุณป้อนได้ถูกจัดเรียงแล้ว?
iruvar

ฉันจะสร้างรายการสุ่มด้วยตัวเลขและตรวจสอบเพื่อให้แน่ใจว่า
karlpy

2
สัญกรณ์บิ๊กโอเป็นเรื่องเกี่ยวกับสิ่งที่เกิดขึ้นเมื่อความยาวของอินพุตใกล้ถึงอนันต์: มันบอกคุณว่าอัลกอริธึมมีขนาดใหญ่ด้วยอินพุต อัลกอริทึมบางอย่างทำงานได้ดีขึ้นกับขนาดอินพุตขนาดเล็ก
ctrl-alt-delor

1
Karlpy คุณสั่งงานอะไรในลำดับก่อนหรือเรียงลำดับ? ที่อาจสร้างความแตกต่างเนื่องจากไฟล์แคช
iruvar

1
@karlpy: "ฉันเปลี่ยนชื่อไฟล์ ... " ถ้าคุณหมายความว่าคุณเปลี่ยนชื่อไฟล์นั่นก็ไม่ดีพอ การเปลี่ยนชื่อไฟล์จะเชื่อมโยงชื่อใหม่กับไอโหนดเก่าซึ่งยังคงชี้ไปที่บล็อกข้อมูลเดิม หากพวกเขาถูกแคชพวกเขาจะยังคงแคช ISTM ที่เทคนิคที่ดีกว่ามากคือ (1) สร้างสำเนาไฟล์จากนั้น (2) เรียกใช้คำสั่งหนึ่งคำสั่งในไฟล์เดียวและ (3) เรียกใช้คำสั่งอื่น ๆ ในไฟล์อื่น
สกอตต์

คำตอบ:


3

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

PS: ทำสิ่งที่จำเป็นด้วย nawk, mawk และ gawk เพื่อให้รายละเอียดเพิ่มเติมแก่เรา "ลงในโซน";) และทำการวิ่งเช่น 100 ครั้งต่อนาทีโดยมีค่าเบี่ยงเบนมาตรฐาน, สูงสุด, เฉลี่ยและเบี่ยงเบนมาตรฐาน

กรณีใด ๆ กลับไปที่คำถามในมือจาก CompSci 210 มันเป็นเรื่องเกี่ยวกับอัลกอริทึมที่ใช้ การเรียงใช้ประโยชน์จากหลายอย่างขึ้นอยู่กับขนาดและข้อ จำกัด ของหน่วยความจำที่กดเพื่อบันทึกไฟล์ลงดิสก์ในไฟล์ชั่วคราวเพื่อทำการเรียงลำดับเมื่อหน่วยความจำหมดและคุณจะต้องมองเข้าไปในซอร์สโค้ดเพื่อดูว่ามีอะไรบ้าง คำสั่ง sort (1) ที่เฉพาะเจาะจงใช้บนระบบปฏิบัติการเฉพาะที่คุณใช้งานอยู่ แต่จากประสบการณ์ที่มันโหลดลงในหน่วยความจำให้มากที่สุดเท่าที่จะทำได้ให้ทำการเรียงลำดับอย่างรวดเร็วเขียนเขียนลงดิสก์ล้างซ้ำและที่ ท้ายที่สุดมันจะทำการเรียงไฟล์เล็ก ๆ เรียงกัน ดังนั้นที่นี่คุณจะมี O (n * log2 (N)) สำหรับชิ้นส่วนแล้วดำเนินการผสาน O (n * log (n)) โดยประมาณ

awk: กลไก x [$ 0] ++ คือ "สมมติ" เพื่อใช้การแปลงแป้นพิมพ์ แต่ปัญหาเกี่ยวกับ hashing การดำเนินการ "ค้นหา" O (1) ที่ควรจะเป็นคือการชนกันและการจัดการการชน นี่อาจทำให้เกิดปัญหาเมื่อข้อมูลไม่ได้รับการกระจายอย่างดีหรือไม่เติมที่ถัง ฯลฯ และในรายการขนาดใหญ่การแฮชอาจเป็นปัญหาหน่วยความจำขนาดใหญ่หากการจัดการการชนไม่ถูกต้อง (และคุณอาจต้อง ปรับแต่งอัลกอริทึมการแฮชสำหรับข้อมูลที่คาดไว้) จากนั้นคุณต้องดูประสิทธิภาพของฟังก์ชั่นการแฮชจริงแล้ว O (1) อาจใกล้เคียงกับ O (log (n)) สำหรับส่วนแทรก (Ie. O (1) สำหรับการค้นหาครั้งแรกและหากไม่มีคุณจะเพิ่มซึ่งอาจเป็น O (log (n))) และจากนั้น n * O (1) จะกลายเป็น * O (log (n)) = > O (n * log (n)) ไม่ต้องพูดถึงว่าคุณกำลังทำสิ่งต่าง ๆ ในลักษณะ "ตีความ" :)


-2

ความแตกต่างของความเร็วเป็นเพราะ 'sort' เป็นคำสั่ง ( ลิงก์ ) ในขณะที่ 'awk' เป็นภาษาโปรแกรม ( ลิงก์ )

คำสั่ง 'sort' ใช้เวลาอินพุตและส่งคืนเอาต์พุต โดยที่ 'awk' เป็นภาษาการเขียนโปรแกรมซึ่งแปลรหัส (คำสั่งเทอร์มินัล) เป็นครั้งแรกจากนั้นเริ่มประมวลผล เรียบง่ายเหมือนที่

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