การตรวจจับกลุ่มของรหัสที่มา "คล้ายกัน"


10

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

นี่คือการค้นหากลุ่มที่ไม่มีการดูแล ฉันคิดว่าคำถามนี้เกี่ยวกับคุณลักษณะที่จะใช้มากกว่าอัลกอริทึมการจัดกลุ่มที่จะใช้ สิ่งแรกที่ฉันจะทำคือจดหมายโดยฮิสโทแกรมจดหมาย โดยหลักการแล้วเนื่องจากคนขี้โกงฉลาดกว่านั้นในที่สุดฉันก็ลองเลือกการเรียงสับเปลี่ยนแบบสุ่มเพื่อดูว่ามีฮิสโตแกรมของตัวอักษร (ที่มีการเรียงสับเปลี่ยน) อยู่หรือไม่ ยิ่งไปกว่านั้นผู้ที่ไม่สำรวจโครงสร้างของรหัสเฉพาะการกระจายตัวอักษรเพียงเล็กน้อย ... คุณมีทางออกอะไร มีซอฟต์แวร์หรือแพ็คเกจที่มีอยู่เฉพาะสำหรับปัญหานั้นหรือไม่ (อันที่จริงในสมัยก่อนครูวิทยาศาสตร์คอมพิวเตอร์อ้างว่าพวกเขามีเครื่องมือประเภทนั้น แต่ตอนนี้ฉันสงสัยว่าพวกเขามีอะไรที่ง่ายมาก)

ฉันเดาว่าทนายความจากการพัฒนาซอฟต์แวร์มีปัญหาประเภทนั้นด้วย (ไม่ใช่กับนักเรียน 1,000 คน แต่ด้วยรหัสขนาดใหญ่ 2 รหัส ... ซึ่งทำให้สิ่งต่าง ๆ ยากขึ้น)?

คำตอบ:


4

ขั้นตอนการประมวลผลล่วงหน้าที่ชัดเจนคือการผสานไฟล์ที่เหมือนกันอย่างแท้จริง

หลังจากนั้นที่สำคัญคือการฟื้นฟู เมื่อถึงจุดหนึ่งนักเรียนจะเริ่ม refactoring รหัสเปลี่ยนชื่อตัวแปรและอื่น ๆ หรือใส่ความคิดเห็นใหม่ ฮิสโตแกรมตัวอักษรได้รับผลกระทบมากเกินไปจากนี้ (รวมถึงมันจะจับคุณสมบัติภาษาจำนวนมาก)

เทคนิคทั่วไปคือการใช้ parser เฉพาะภาษาและแปลงรหัสแหล่งที่มาเป็นต้นไม้ไวยากรณ์นามธรรม จากนั้นแยกฟีเจอร์จากสิ่งนี้ และอาจวิเคราะห์ความคิดเห็นแยกกันคู่ขนาน

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


เพียงแค่ต้องการเพิ่มว่าการเรียงลำดับทั่วไปที่ยาวที่สุดสามารถพบได้อย่างมีประสิทธิภาพโดยใช้Suffix treeหรืออาร์เรย์ต่อท้าย
sebp

ขอบคุณ Anony ฉันชอบจิตวิญญาณของคำตอบของคุณจริงๆ ดูเหมือนว่าสถิติมิติสูงจริงด้วย "การเปลี่ยนรูปแบบข้อมูล" และค้นหารูปแบบสุดขั้ว ระยะทางแบบไหนที่คุณจะวางบนต้นไม้เหล่านั้น?
robin girard

ฉันไม่ใช่ผู้เชี่ยวชาญด้านความคล้ายคลึงของตัวแทน AST ฉันเชื่อว่ามีความคิดเกี่ยวกับ "การจำลอง" ในแง่ที่ว่าต้นไม้หนึ่งต้นเป็นต้นไม้ย่อยที่พิเศษชนิดหนึ่ง ในการเปรียบเทียบ AST คุณจะต้องจัดเรียงและนับความแตกต่างสัมพัทธ์ฉันเดา อาจไม่คำนึงถึงลำดับของสาขาดังนั้นการเรียงลำดับรหัสใหม่จะไม่เปลี่ยนผลลัพธ์ โปรดระวังว่าคุณอาจไปถึงจุดที่คุณได้รับผลบวกที่ผิดพลาดเพราะมีวิธีการแก้ปัญหาอย่างไม่มีประสิทธิภาพและคุณได้ผลบวกที่ผิดพลาดเพียงเพราะพวกเขาพบวิธีแก้ปัญหาที่ถูกต้อง ...
มี QUIT - Anony-Mousse

0

จากโลกต่อต้านการลอกเลียนแบบก่อนหน้านี้ฉันเคยพบกับแนวคิดเรื่อง "กราฟ Isomorphism" บางทีคุณก็สามารถดูได้เช่นกัน

LCS - ผลที่ตามมายาวนานที่สุดเป็นไปได้เช่นกัน แต่ลองเปรียบเทียบโซลูชันเหล่านี้ทั้งหมดแล้วดูว่าดีที่สุด :)


ยินดีต้อนรับสู่เว็บไซต์นี้! คุณสามารถให้การอ้างอิงบางส่วนเกี่ยวกับงานดังกล่าวและอาจมีรายละเอียดเพิ่มเติมเพื่อให้ผู้อ่านได้รับแนวคิดที่ดีขึ้นว่ากราฟ isomorphism หรือ LCS สามารถแก้ไขปัญหาได้อย่างไร?
chl
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.