"Benzer" kaynak kodlarının kümelerini algılama


10

Bir bilgisayar bilimi projesi yapmak zorunda olan 400 öğrencim olduğunu ve tek başına çalışmak zorunda olduklarını varsayalım (hiçbir öğrenci grubu yok). Bir proje örneği "fortran'da hızlı bir fourier dönüşüm algoritması uygulanmasına izin verebilir" (Biliyorum, seksi görünmüyor, ancak sorumu daha basit hale getiriyor). Ben düzelticiyim ve "gerçekten bağımsız olarak yazılamayacak kadar benzer" bir uygulama öneren öğrenci grupları olup olmadığını kontrol etmek için rutinleri göndermek istiyorum.

Bu, kümeler için denetimsiz bir aramadır. Sorunun, hangi kümeleme algoritmasının kullanılacağı yerine hangi niteliklerin kullanılacağı hakkında olduğunu düşünüyorum. İlk yapacağım şey histogram harfiyle bir harftir. İdeal olarak, dolandırıcıların bundan daha akıllı olduğu için, sonunda harflerin histogramının (permütasyon ile) iyi bir eşleşmesinin olup olmadığını görmek için harflerin iyi seçilmiş rastgele permütasyonlarını deneyeceğim. Ayrıca kodun yapısını keşfetmeyenler, sadece harflerin marjinal dağılımını ... ne çözümünüz var? bu probleme adanmış mevcut yazılım veya paketler var mı? (aslında eski günlerimde bilgisayar bilimleri öğretmenleri bu tür araçlara sahip olduklarını iddia ettiler, ancak şimdi çok basit bir şeyleri olduğundan şüpheleniyorum)

Yazılım geliştirmelerinin avukatının da bu tür sorunları var (1000 öğrenciyle değil, 2 büyük kodla ... bu da işleri zorlaştırıyor)?

Yanıtlar:


4

Bariz ön işleme adımı, gerçekten aynı olan dosyaları birleştirmektir.

Bundan sonra anahtar normalleşmedir . Bir noktada, öğrenciler kodu yeniden düzenlemeye, değişkenleri yeniden adlandırmaya başlayacaktır. Veya yorumları yeniden yazın. Bir harf histogramı bundan çok fazla etkilenir (artı birçok dil özelliğini yakalar).

Yaygın bir teknik, dile özgü bir ayrıştırıcı kullanmak ve kaynak kodunu soyut bir sözdizimi ağacına dönüştürmektir. Sonra bundan özellikleri ayıklayın. Ve yorumları paralel olarak ayrı ayrı analiz edebilirsiniz.

Sonra satır tabanlı "en uzun ortak alt çizgi" yaklaşımı var. Tek satırlarda oldukça iyi bir benzerlik varsa, iki dosyanın en uzun ortak sırasını arayabilirsiniz. Bu aynı zamanda birkaç eşleşme de sağlayacaktır.


Sadece en uzun ortak dizinin Suffix ağaçları veya sonek dizileri kullanılarak verimli bir şekilde bulunabileceğini eklemek istedim .
sebp

Teşekkürler Anony, cevabınızın ruhunu gerçekten seviyorum (ve onu oyladım). "Veri aktarımı" ile gerçek yüksek boyutlu istatistikler gibi geliyor ve aşırı kalıpları arıyor. O ağaçlara ne tür bir mesafe koyardınız?
robin girard

AST temsillerinin benzerliği konusunda uzman değilim. Bir ağacın diğerinin özel bir alt ağacı olduğu anlamında bir "simülasyon" kavramı olduğuna inanıyorum. AST'leri karşılaştırmak için, onları hizalamanız ve göreceli farklılıkları saymanız gerekir, sanırım. Belki şubelerin sırasını dikkate almaz, bu nedenle önemsiz kod yeniden sıralamaları sonuçları değiştirmez. Yanlış pozitif aldığınız noktaya ulaşabileceğinizi unutmayın, çünkü problemi verimli bir şekilde çözmenin n yolu vardır ve sadece doğru çözümü buldukları için yanlış pozitifler alırsınız ...
QUIT - Anony-Mousse

0

İntihal karşıtı dünyadan daha önce "Grafik İzomorfizmi" kavramına rastladım. Belki de buna bir göz atabilirsiniz.

LCS - En Uzun Ortak Subququence da mümkündür. Ancak tüm bu çözümleri karşılaştırmaya ve en iyi olanı görmeye çalışın :)


Bu siteye hoş geldiniz! Yukarıda bahsedilen çalışma hakkında bazı referanslar verebilir misiniz ve belki daha fazla ayrıntı, böylece okuyucuların grafik izomorfizmi veya LCS'nin eldeki sorunu nasıl çözebileceği hakkında daha iyi bir fikir edinebilirler mi?
chl
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.