汉明距离算法.md 3.3 KB

fn hamming_distance(s1: &str, s2: &str) -> u32 {
    assert_eq!(s1.len(), s2.len());
    s1.chars().zip(s2.chars()).filter(|(c1, c2)| c1 != c2).count() as u32
}

该函数接收两个字符串作为参数,并返回它们的汉明距离。它通过将两个字符串的字符进行拉链(zip)操作,并过滤出不同的字符对来计算汉明距离。

为了使用该函数,您可以这样调用:

let distance = hamming_distance("1101", "0001");
println!("The Hamming distance is {}", distance);

在这个例子中,调用hamming_distance函数会输出“The Hamming distance is 3”。

进阶 更为复杂的例子,它实现了一个用于比较两个DNA序列的算法:

use std::collections::HashMap;

fn count_nucleotides(s: &str) -> HashMap<char, usize> {
    let mut map = HashMap::new();
    for c in s.chars() {
        let counter = map.entry(c).or_insert(0);
        *counter += 1;
    }
    map
}

fn main() {
    let s1 = "AGCTTTTCATTCTGACTGCAACGGGCAATATGTCTCTGTGTGGATTAAAAAAAGAGTGTCTGATAGCAGC";
    let s2 = "AGCTTTTCATTCTGACTGCAACGGGCAATATGTCTCTGTGTGGATTAAAAAAAGAGTGTCTGATAGCAGC";
    assert_eq!(count_nucleotides(s1), count_nucleotides(s2));
}

该算法首先定义了一个名为count_nucleotides的函数,该函数接收一个字符串作为参数,并返回一个HashMap,其中键为字符('A'、'C'、'G'和'T'),值为该字符出现的次数。

然后,在main函数中,我们调用了count_nucleotides函数两次,并使用assert_eq!宏来比较它们的结果。如果两个HashMap完全相同,则说明输入的两个DNA序列是完全相同的。

计算文件的哈希值

如果您想计算一个文件的哈希值,您可以使用Rust语言中的标准库中的crypto模块。下面是一个使用Rust计算文件哈希值的例子:

use std::fs::File;
use std::io::{BufRead, BufReader};
use std::collections::HashMap;
use std::time::Instant;

use crypto::digest::Digest;
use crypto::sha2::Sha256;

fn count_lines(path: &str) -> usize {
    let f = File::open(path).unwrap();
    let reader = BufReader::new(f);
    reader.lines().count()
}

fn main() {
    let path = "test.txt";
    let num_lines = count_lines(path);
    let mut hasher = Sha256::new();
    let start = Instant::now();

    let f = File::open(path).unwrap();
    let mut reader = BufReader::new(f);
    let mut buffer = String::new();

    while reader.read_line(&mut buffer).unwrap() > 0 {
        hasher.input_str(&buffer);
        buffer.clear();
    }

    let hash = hasher.result_str();
    let elapsed = start.elapsed();
    println!("{} lines hashed in {:?}: {}", num_lines, elapsed, hash);
}

该例子定义了两个函数:count_linesmaincount_lines函数用于计算给定文件中的行数,并返回结果。main函数则用于计算文件的哈希值。

首先,main函数使用count_lines函数来计算文件中的行数。然后,它创建了一个Sha256对象,用来计算文件的哈希值。接着,它打开了给定的文件,并逐行读取文件内容。每当读取一行时,它就将该行的内容传递给Sha256对象的input_str方法,并将缓冲区清空。最后,它调用Sha256对象的result_str方法来获取文件的哈希值,并将结果打印出来。