2013-04-28 18 views
6

Trong tác vụ này, tôi cần có khoảng cách Hamming (khoảng cách Hamming giữa hai chuỗi có chiều dài bằng nhau là số vị trí mà các ký hiệu tương ứng khác nhau - từ Wikipedia) giữa hai chuỗi sequence1 và sequence2.Sử dụng vòng lặp để lấy khoảng cách Hamming giữa 2 chuỗi

Đầu tiên tôi đã tạo 2 chuỗi mới là 2 chuỗi gốc nhưng cả hai đều có chữ thường để dễ so sánh. Sau đó, tôi phải sử dụng vòng lặp for và nếu so sánh 2 chuỗi. Đối với bất kỳ sự khác biệt nào trong các ký tự trong 2 cặp chuỗi này, vòng lặp sẽ thêm 1 vào một int x = 0. Trả về của phương thức sẽ là giá trị của x này.

public static int getHammingDistance(String sequence1, String sequence2) { 
    int a = 0; 
    String sequenceX = sequence1.toLowerCase(); 
    String sequenceY = sequence2.toLowerCase(); 
    for (int x = 0; x < sequenceX.length(); x++) { 
     for (int y = 0; y < sequenceY.length(); y++) { 
      if (sequenceX.charAt(x) == sequenceY.charAt(y)) { 
       a += 0; 
      } else if (sequenceX.charAt(x) != sequenceY.charAt(y)) { 
       a += 1; 
      } 
     } 
    } 
    return a; 
} 

Vậy mã có vẻ tốt và đủ chức năng? Bất cứ điều gì tôi có thể sửa chữa hoặc để tối ưu hóa mã? Cảm ơn trước. Tôi là một noob lớn nên tôi xin lỗi nếu tôi hỏi bất cứ điều gì ngớ ngẩn

+0

'bất cứ điều gì tôi có thể làm để khắc phục' là câu hỏi thuộc về đây. Câu hỏi 'tối ưu hóa 'thuộc về Code-Review –

+0

Câu hỏi này phù hợp hơn với http://codereview.stackexchange.com/. Bạn sẽ nhận được câu trả lời đẹp hơn ở đó, quá. – jpaugh

+0

là bài tập về nhà này? –

Trả lời

3

mã của bạn hoàn toàn tắt. như bạn đã nói, khoảng cách là số vị trí các chuỗi khác nhau - vì vậy bạn chỉ nên có 1 vòng lặp, đi qua cả hai chuỗi cùng một lúc. thay vào đó bạn có 2 vòng lồng nhau so sánh mọi chỉ mục trong chuỗi a với mọi chỉ mục trong chuỗi b.

cũng vậy, viết điều kiện nếu kết quả là a+=0 là một sự lãng phí thời gian.

thử này để thay thế:

for (int x = 0; x < sequenceX.length(); x++) { //both are of the same length 
    if (sequenceX.charAt(x) != sequenceY.charAt(x)) { 
     a += 1; 
    } 
} 

cũng vậy, đây vẫn là một cách tiếp cận ngây thơ mà sẽ probbaly không làm việc với các ký tự unicode phức tạp (trong đó 2 nhân vật có thể được một cách logic bình đẳng nhưng không có mã ký tự giống nhau)

+0

Cảm ơn sự giúp đỡ. Trong phạm vi của vấn đề nó sẽ làm công việc tốt. Cảm ơn một lần nữa: D – Doh

0

Mã của bạn là OK, tuy nhiên tôi khuyên bạn nên cải tiến những điều sau đây.

  1. không sử dụng charAt() của chuỗi. Lấy mảng char từ chuỗi sử dụng toCharArray() trước khi lặp và sau đó làm việc với mảng này. Điều này dễ đọc hơn và hiệu quả hơn.
  2. Cấu trúc

    if (sequenceX.charAt(x) == sequenceY.charAt(y)) { 
         a += 0; 
        } else if (sequenceX.charAt(x) != sequenceY.charAt(y)) { 
         a += 1; 
        } 
    

    trông dư thừa. Sửa lỗi thành: nếu (sequenceX.charAt (x) == sequenceY.charAt (y)) { a + = 0; } else { a + = 1; }

Hơn nữa tính đến mà tôi đề nghị bạn làm việc với mảng thay đổi nó thành một cái gì đó như:

a += seqx[x] == seqY[x] ? 0 : 1

mã ít hơn ít lỗi ...

EDIT: như mentionded bởi @radai bạn không cần cấu trúc if/else chút nào: thêm 0 vào a là không cần thiết.

+0

"không sử dụng charAt() của chuỗi. Nhận mảng char từ chuỗi sử dụng toCharArray() trước khi vòng lặp và sau đó làm việc với mảng này. Điều này là dễ đọc hơn và hiệu quả hơn" -> Liệu nó thực sự quan trọng khi bạn có phần biên dịch đúng lúc? Tôi có nghĩa là tôi đã không thử nghiệm nó một mình, nhưng tôi tưởng tượng charAt sẽ được tối ưu hóa đi. –

5

Từ quan điểm của tôi thực hiện sau đây sẽ là ok:

public static int getHammingDistance(String sequence1, String sequence2) { 
    char[] s1 = sequence1.toCharArray(); 
    char[] s2 = sequence2.toCharArray(); 

    int shorter = Math.min(s1.length, s2.length); 
    int longest = Math.max(s1.length, s2.length); 

    int result = 0; 
    for (int i=0; i<shorter; i++) { 
     if (s1[i] != s2[i]) result++; 
    } 

    result += longest - shorter; 

    return result; 
} 
  1. sử dụng mảng, những gì tránh được gọi hai phương pháp (charAt) cho mỗi char duy nhất mà cần phải được so sánh;
  2. tránh ngoại lệ khi một chuỗi dài hơn chuỗi kia.
1
public static int getHammingDistance(String sequenceX, String sequenceY) { 
    int a = 0; 
    // String sequenceX = sequence1.toLowerCase(); 
    //String sequenceY = sequence2.toLowerCase(); 
    if (sequenceX.length() != sequenceY.length()) { 
     return -1; //input strings should be of equal length 
    } 

    for (int i = 0; i < sequenceX.length(); i++) { 
     if (sequenceX.charAt(i) != sequenceY.charAt(i)) { 
      a++; 
     } 
    } 
    return a; 
} 
Các vấn đề liên quan