2.1. νŒ¨ν„΄μ°ΎκΈ°μ˜ μ€‘μš”μ„±

🧬 생물학적 μ •λ³΄λŠ” DNA μ„œμ—΄λ‘œ μœ μ§€λ˜κΈ° λ•Œλ¬Έμ— μ„œμ—΄ λ°μ΄ν„°μ˜ νŒ¨ν„΄ 뢄석은 μ€‘μš”ν•¨
🧬 μ„œμ—΄ λ°μ΄ν„°μ˜ νŒ¨ν„΄μ€ λΆ„μžμ˜ νŠΉμ • κΈ°λŠ₯에 μ—°κ΄€λ˜μ–΄ 있음
🧬 λ‹¨λ°±μ§ˆμ΄ νŠΉμ • κΈ°λŠ₯을 μˆ˜ν–‰ν•˜λ €λ©΄ λ‹¨λ°±μ§ˆμ˜ ꡬ쑰에 νŠΉμ •ν•œ νŒ¨ν„΄μ΄ ν•„μš”ν•˜λ©°, 그것에 μƒμ‘ν•˜λŠ” DNA μ„œμ—΄ νŒ¨ν„΄μ΄ 쑴재
🧬 λ˜ν•œ DNA μ„œμ—΄μ—λŠ” μœ μ „μž λ°œν˜„λŸ‰μ„ μ‘°μ ˆν•˜λŠ” κ²°ν•©λΆ€μœ„ 등이 κ΄€λ ¨λ˜μ–΄ μžˆκΈ°λ„ 함

2.1.1. κ³ μ •λœ νŒ¨ν„΄μ„ μ°ΎλŠ” λ‹¨μˆœ μ•Œκ³ λ¦¬μ¦˜


🧬 μ°ΎμœΌλ €λŠ” νŒ¨ν„΄μ˜ 처음 μœ„μΉ˜λ₯Ό μ°Ύκ±°λ‚˜ μ°ΎμœΌλ €λŠ” νŒ¨ν„΄μ˜ λͺ¨λ“  μœ„μΉ˜λ₯Ό μ°ΎλŠ” μ•Œκ³ λ¦¬μ¦˜
🧬 search_first_occ( ) ν•¨μˆ˜ 생성 : νŒ¨ν„΄μ΄ 처음 λ‚˜νƒ€λ‚˜λŠ” μœ„μΉ˜λ₯Ό λ°˜ν™˜ν•˜κ±°λ‚˜ λ°œμƒν•˜μ§€ μ•ŠμœΌλ©΄ -1을 λ°˜ν™˜ν•¨
🧬 search_all_occurences( ) ν•¨μˆ˜ 생성 : μ„œμ—΄μ—μ„œ νŒ¨ν„΄μ΄ μΌμΉ˜ν•˜λŠ”μ§€ κ²€μ‚¬ν•˜κ³  μœ„μΉ˜ 리슀트λ₯Ό λ°˜ν™˜ν•¨. μ—†μœΌλ©΄ 빈 리슀트 λ°˜ν™˜
🧬 test_pat_search( ) ν•¨μˆ˜ 생성 : μ‚¬μš©μžκ°€ μž…λ ₯ν•œ μ„œμ—΄ 데이터에도 μ μš©κ°€λŠ₯


πŸ’Š search_first_occ( )

  • i : DNA seq 의 인덱슀
  • j : pattern seq 의 인덱슀
  • DNA μ„œμ—΄κ³Ό pattern μ„œμ—΄μ˜ 첫 μ—ΌκΈ°κ°€ λ‹€λ₯΄λ©΄ i += 1 에 μ˜ν•΄ DNA μ„œμ—΄μ„ ν•œμΉΈμ”© μ΄λ™ν•˜λ©΄μ„œ 읽음
  • κ·ΈλŸ¬λ‹€κ°€ 첫 μ—ΌκΈ°κ°€ κ°™μœΌλ©΄ j = j + 1 에 μ˜ν•΄ DNA([ i+j ]) μ„œμ—΄κ³Ό pattern([ j ]) μ„œμ—΄μ„ ν•œμΉΈμ”© μ΄λ™ν•˜λ©΄μ„œ 읽음
  • λ§Œμ•½ μ΄λŸ¬ν•œ κ³Όμ • 쀑에 λ‹€λ₯Έ μ—ΌκΈ°κ°€ 발견되면 i += 1 을 μ‹€ν–‰ν•˜κ³  jλŠ” λ‹€μ‹œ 0으둜 μ΄ˆκΈ°ν™”
  • μ°ΎλŠ” pattern κ³Ό μ™„μ „νžˆ μΌμΉ˜ν•˜λ©΄ j == len(pattern) 에 μ˜ν•΄ found = True
  • pattern 이 DNA seq μ—μ„œ 처음 λ‚˜νƒ€λ‚˜λŠ” μœ„μΉ˜μΈ i λ₯Ό λ°˜ν™˜ν•¨
def search_first_occ(seq, pattern):
    found = False
    i = 0
    while i < len(seq)-len(pattern) and not found:
        j = 0
        while j < len(pattern) and pattern[j]==seq[i+j]:
            j = j + 1
        if j == len(pattern):
            found = True
        else:
            i += 1
    if found: return i
    else: return -1
        
seqDNA = "ATAGAATAGATAATAGTC"
print(search_first_occ(seqDNA, "GAAT"))
print(search_first_occ(seqDNA, "TATA"))
>> 3
  -1

πŸ’Š search_all_occurrences( )

  • i : DNA seq 의 인덱슀
  • j : pattern seq 의 인덱슀
  • DNA seq κ³Ό pattern seq 의 첫 μ—ΌκΈ°κ°€ λ‹€λ₯΄λ©΄ for문에 μ˜ν•΄μ„œ i += 1 이 λ˜λ©΄μ„œ DNA μ„œμ—΄μ„ ν•œμΉΈμ”© μ΄λ™ν•˜λ©΄μ„œ 읽음
  • 첫 μ—ΌκΈ°κ°€ κ°™μœΌλ©΄ j = j + 1 에 μ˜ν•΄ DNA ([ i+j ]) μ„œμ—΄κ³Ό pattern seq ([ j ]) μ„œμ—΄μ„ ν•œμΉΈμ”© μ΄λ™ν•˜λ©΄μ„œ 읽음
  • κ·ΈλŸ¬λ‹€κ°€ μ™„μ „νžˆ μΌμΉ˜ν•˜λŠ” νŒ¨ν„΄μ΄ 발견되면 DNA seqμ—μ„œ 처음 λ‚˜νƒ€λ‚˜λŠ” μœ„μΉ˜μΈ i λ₯Ό res λ¦¬μŠ€νŠΈμ— μΆ”κ°€
  • for 문에 μ˜ν•΄μ„œ λͺ¨λ“  DNA μ—ΌκΈ°μ„œμ—΄μ— λŒ€ν•΄μ„œ search κ°€ κ°€λŠ₯함
  • μ΄λ ‡κ²Œ μœ„μΉ˜λ₯Ό μΆ”κ°€ν•œ 리슀트인 res λ°˜ν™˜
def search_all_occurrences(seq, pattern):
    res = []
    for i in range(len(seq)-len(pattern)+1):
        j = 0
        while j < len(pattern) and pattern[j]==seq[i+j]:
            j = j + 1
        if j == len(pattern):
            res.append(i)
    return res

seqDNA = "ATAGAATAGATAATAGTC"
print(search_all_occurrences(seqDNA, "AAT"))
>> [4, 11]

def test_pat_search():
    seq = input("Input sequence: ")
    pat = input("Input pattern: ")
    print(pat, "occrs in the following positions: ")
    print(search_all_occurrences(seq, pat))
    
test_pat_search()
>>
Input sequence: ATGGGATCGTAGTCGTACTAGCTAGCTGATGGTACTCGATAGTCTACGTAGCTAGTGGTACTGGATGGTACTCAGTAACAT
Input pattern: AT
AT occrs in the following positions: 
[0, 5, 28, 38, 64, 79]

🧬 이번 ν¬μŠ€νŒ…μ—μ„œλŠ” λ‹¨μˆœν•˜κ²Œ μ„œμ—΄λ“€μ„ ν•œμΉΈμ”© μ΄λ™ν•˜λ©΄μ„œ λΉ„κ΅ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜μ„ λ‹€λ€„λ³΄μ•˜λ‹€. ν•˜μ§€λ§Œ μ΄λ ‡κ²Œ 일일이 λΉ„κ΅ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜μ€ λ„ˆλ¬΄ λ§Žμ€ 싀행을 ν•΄μ•Όν•˜λŠ” κ²½μš°κ°€ 있고, 데이터 양이 λ§Žμ€ 생λͺ…λ°μ΄ν„°μ—λŠ” μ ν•©ν•˜μ§€ μ•Šλ‹€κ³  μƒκ°ν•œλ‹€.

🧬 λ‹€μŒ ν¬μŠ€νŒ…μ—μ„œλŠ” μ’€ 더 ν–₯μƒλœ 보이어-무어 μ•Œκ³ λ¦¬μ¦˜μ— λŒ€ν•΄μ„œ λ°°μ›Œλ³΄μž.


πŸ’‘ Bioinformatics Algorithms(μ—μ΄μ½˜μΆœνŒ, 2020)λ₯Ό κ³΅λΆ€ν•˜κ³  개인 ν•™μŠ΅μš©μœΌλ‘œ μ •λ¦¬ν•œ μžλ£Œμž…λ‹ˆλ‹€.

Leave a comment