Ένα εργαστήριο βιοπληροφορικής ψάχνει λύσεις για να βρίσκει αποδοτικά κοινές αλληλουχίες DNA ανάμεσα σε διαφορετικά άτομα ή ακόμα και οργανισμούς, γνωστό και ως DNA matching.
Το DNA συνήθως το αναπαριστούμε με την μορφή μιας
αλυσίδας (συμβολοσειράς) από τέσσερα διαφορετικά στοιχεία που λέγονται βάσεις: A
(Αδενίνη), G (Γουανίνη), T (Θυμίνη) και C (Κυτοσίνη) τα οποία μπορούν να συνδυαστούν με
οποιαδήποτε σειρά. Προκειμένου να κάνουμε DNA matching θέλουμε να δούμε αν υπάρχουν
κοινά τμήματα σε αυτές τις αλυσίδες DNA και να δούμε πόσο μεγάλες είναι. Το Σχήμα 4 της
εκφώνησης δείχνει ένα παράδειγμα δύο αλυσίδων με κοινό τμήμα: οι αλυσίδες
CATTAGATATAGACG και CTATAGATATAGGGC έχουν κοινό το τμήμα TAGATATAG.
Για το ζητούμενο αυτής της άσκησης, καλείστε να γράψετε ένα πρόγραμμα που διαβάζει δύο αλυσίδες DNA, βρίσκει την μέγιστη κοινή αλυσίδα ανάμεσα στις δύο και την τυπώνει.
Τεχνικές Προδιαγραφές
progintro/hw2-<YourUsername>dna/src/dna.c./dna filename1 filename2. Για το περιεχόμενο των αρχείων
δείτε παρακάτω. Αν δεν περαστούν δύο ορίσματα στην γραμμή εντολών ή οποιοδήποτε από
τα αρχεία δεν μπορεί να ανοιχτεί το πρόγραμμα πρέπει να επιστρέφει με κωδικό εξόδου
(exit code) 1.gcc -Ofast -m32 -Wall -Wextra -Werror -pedantic -o dna dna.c -lmdna/README.mddna/test/input1.dnadna/test/input2.dnadna/test/output.dnaΠαρακάτω παραθέτουμε την αλληλεπίδραση με μια ενδεικτική λύση με μερικά δείγματα DNA που κατεβάσαμε:
$ gcc -Ofast -Wall -Wextra -Werror -pedantic -o dna dna.c -lm
$ wc -c *.dna
62487 alien.dna
8193 carsonella-ruddii.dna
47811 claviceps-purpurea.dna
21992 escherichia-coli.dna
16 sample1.dna
16 sample2.dna
99492 theobroma-cacao.dna
240007 total
$ $./dna
Error: arguments missing. Usage: ./dna dnafile1 dnafile2
$ echo $?
1
$ ./dna3 foo.bar bar.zonk
Error: cannot open file foo.bar
$ echo $?
1
$ cat sample1.dna
CATTAGATATAGACG
$ cat sample2.dna
CTATAGATATAGGGC
$ ./dna sample1.dna sample2.dna
TAGATATAG
$ echo -e "CTATAGAT\nHello WORLDATAGGG" > split.dna
$ ./dna split.dna split.dna
CTATAGATATAGGG
$ ./dna carsonella-ruddii.dna sample1.dna
ATATAGACG
$ ./dna escherichia-coli.dna carsonella-ruddii.dna
AATTAAAATTTTATT
$ ./dna claviceps-purpurea.dna carsonella-ruddii.dna
GTTTTTTTTTTCT
$ time ./dna theobroma-cacao.dna escherichia-coli.dna
GGTTTGCTTTTATG
real 0m4.550s
user 0m4.549s
sys 0m0.001s
$ time ./dna theobroma-cacao.dna alien.dna
AAAAAAAAAAAAAAAAACC
real 0m2.828s
user 0m2.827s
sys 0m0.001s
$ time ./dna theobroma-cacao.dna theobroma-cacao.dna > shared.dna
real 0m21.817s
user 0m21.815s
sys 0m0.001s
$ wc -c shared.dna
98165 shared.dna
$ md5sum shared.dna
5ca8c9e6fd76d46221d3beadd610b165 shared.dna
$ time ./dna alien.dna alien.dna > shared.dna
real 0m1.917s
user 0m1.915s
sys 0m0.001s
$ wc -c shared.dna
62488 shared.dna
$ md5sum shared.dna
d4544ab6971c6a54bb375159adc5852b shared.dna
Τα παραπάνω dna αρχεία είναι στο: https://github.com/progintro/data/tree/main/dna
άλλα μπορείτε να δοκιμάσετε και άλλα παραδείγματα δικά σας. Στο αρχείο README.md
πρέπει να προσθέσετε οποιεσδήποτε παρατηρήσεις σας κατά την διεκπεραίωση της άσκησης. Ο
κώδικας απαιτείται να είναι καλά τεκμηριωμένος με σχόλια καθώς αυτό θα είναι μέρος της
βαθμολόγησης.
Πρόκειται για το πρόβλημα της μέγιστης κοινής υποσυμβολοσειράς (διαδοχικοί χαρακτήρες, όχι υποακολουθία). Φιλτράρετε πρώτα κάθε αρχείο σε μια καθαρή συμβολοσειρά μόνο με A, G, T, C, σε δυναμικά δεσμευμένη μνήμη. Μια σχέση του τύπου «μήκος κοινού τμήματος που τελειώνει στη θέση i της πρώτης και j της δεύτερης» δίνει λύση δυναμικού προγραμματισμού· ένας πλήρης πίνακας 100.000 × 100.000 όμως δεν χωράει στη μνήμη, οπότε σκεφτείτε ποιες γραμμές του χρειάζεστε πραγματικά κάθε στιγμή.
Αριθμός στον οδηγό: Α25.2
(στο κεφάλαιο) ·
Μόνιμο αναγνωριστικό: hw-2023-hw2-dna ·
Σύνδεσμος: https://progintro.github.io/study/questions/homework/hw-2023-hw2-dna.html ·
Markdown (GitHub)