2014-04-30 49 views
0

我目前正在嘗試編寫一個函數,它可以幫助我找到二進制字符串之間的相似性。這聽起來很模糊,所以我會用一個例子來解釋。查找二進制字符串中的相似性

StringA : 10111010000 
StringB : 10111010011 
StringC : 10111101111 

我希望我的程序能夠找到出現在相同索引處的任何相似性(4位或更多)。在上面的例子中,我的函數會返回:0-4(因爲字符0到4在所有三個字符串中是相同的)。

我不在尋找代碼,只是這樣做的邏輯和最佳方式。

+1

如果您不查找代碼,請不要添加語言標籤(如C#或vb.net)。 – nneonneo

回答

1

字符串是字符數組。

你應該做Loop來比較每個字符。

對於實施例:(I不得不把例如對不起)

for(int i=0;i<=length;i++) \\length = array lenght 
{ 
    if(StringA[i]==StringB[i]) CounterA++; \\or something like this 
} 
0

方法1:字符串分割成任一個陣列或列表,然後使用LINQ查找列表內的分組.. 。

方法2:遍歷每個字符串,然後在每個字符,然後創建一個字符長度的新字符串,並比較在其他琴絃一樣串...

0

假設所有三個項目存儲在他們自己的變量中,我會分裂所有的e比特放入數組中。從那裏,我會遍歷一個數組(因爲所有的數組都是相同的大小),並從那裏匹配。此操作將爲O(n),因爲您必須查看n項。

0

Pseudocode?

陣列:=陣列[號碼]

每個二進制數
每個二進制數如果數字具有在當前索引 陣列相同的二進制位[指數] :=陣列[索引] + 1 最終 結束 結束

1

迭代字符串中的每個字符,如果匹配添加到一個計數器:

private static int GetDifferences(string firstStr, string secondStr) 
{ 
    int val = 0; 

    char[] first = firstStr.ToCharArray(); 
    char[] second = secondStr.ToCharArray(); 

    for (int i = 0; i < first.Length; i++) 
    { 
     if (first[i] == second[i]) 
     { 
      val++; 
     } 
    } 

    return val; 
} 

絕不是完美的,但應該讓你開始

0

我想他們分成列表:

static void Main() 
{ 
    var a = "10111010000"; 
    var b = "10111010011"; 
    var c = "10111101111"; 

    var aList = Split(a, 4); //Use a custom split method 
    var bList = Split(b, 4); 
    var cList = Split(c, 4); 

    Dictionary<int,string> hits = new Dictionary<int, string>(); 

    for (int i = 0; i < aList.Count(); i++) 
    { 
     if(aList[i] == bList[i] && bList[i] == cList[i]) 
      hits.Add(i,aList[i]); 
    } 
} 
0

也許你可以使用位運算符:

  1. 從A XOR結果/ B(說:A^B)和A/C(說:A^C)
  2. 得到不是第1步的結果:〜(A^B); 〜(A^C)
  3. 獲得並從步驟2的結果是:(〜(A^B))&(〜(A^C))
  4. 得到1份從步驟3

例如:

1.

 A^B=10111010000^ 
      10111010011 
     =00000000011; 
     A^C=10111010000^ 
      10111101111 
     =00000111111 

2.

~(A^B)=~(00000000011)=11111111100; 
    ~(A^C)=~(00000111111)=11111000000; 

3.

(~(A^B))&(~(A^C)) =11111111100& 
         11111000000 
         =11111000000 
0

如果你只是想是否有最低獲得真或假4個匹配字符,你可以這樣做:

Public Function StringsHaveMin4CharsInCommon(ByVal StringA As String, ByVal StringB As String, ByVal StringC As String) As Boolean 
Dim bReturn As Boolean 
Dim iCounter As Integer 

For i As Integer = 0 To StringA.Length - 1 

If StringA.SubString(i, 1) = StringB.SubString(i, 1) And StringB.SubString(i, 1) = StringC.SubString(i, 1) Then iCounter += 1 

    If iCounter = 4 Then 
     bReturn = True 
     Exit For 
    End If 

Next i 

Return bReturn 

End Function 

如果您想要檢索匹配的數組索引,那麼您需要向相同的過程添加邏輯,以將每個匹配索引添加到Integer數組,並按如下方式從該函數返回該數組。

Public Function GetCommonIndices(ByVal StringA As String, ByVal StringB As String, ByVal StringC As String) As Integer() 
Dim iReturn() As Integer 
Dim iCounter As Integer = -1 

For i As Integer = 0 To StringA.Length - 1 

    If StringA.SubString(i, 1) = StringB.SubString(i, 1) And StringB.SubString(i, 1) = StringC.SubString(i, 1) Then 

     iCounter += 1 
     ReDim Preserve iReturn(iCounter) 
     iReturn(iCounter) = i 

    End If 

Next i 

Return iReturn 

End Function 

如果沒有匹配的索引,函數將返回Nothing。

這些函數只測試StringA的長度,所以如果StringB或StringC比StringA短,它會引發錯誤。我推斷您將要測試的字符串將被預先驗證爲全部相等長度。