比較陣列的相似度
假設一:一維陣列、順序有差、
假設二:數字會變、位置不會變、
假設三:長數列沒試過、效率可能有問題
假設四:兩造雙方、都是已處理過的陣列、目的在一堆陣列中、找出最相似的一個
原理:先標出每一數字在另一陣列中的位置、沒出現則為0、
int[] aa1 = new int[10] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
int[] aa2 = new int[13] { 55,66,88, 2, 3, 7, 5, 6, 7, 8, 9, 0,1 };
aa2的位置值為{ 13,4,5, 0, 7, 8, 6, 10,11, 12 }
在找出最長的順序_,4,5,_,7,8,_,10,11,12 所以相似度 7/10 x 100 = 70啪
public static int Compare(int[] source, int[] dest)
#region >><<
{
int rtn = 0;
int[] aa1 = new int[source.Length];
int idd = 0;//命中率
int iff = 0;//失敗率
for (int ii = 0; ii < source.Length; ii++)
{
aa1[ii] = Compare(source[ii], 0, dest);
if (aa1[ii] == ii+1) idd++;
else if (aa1[ii] == 0) iff++;
}
rtn = (int)(idd / (double)source.Length) * 100; //出現的順序、
int iff2 = (int)(iff / (double)source.Length * 100);//沒有出現的數量、
if (iff2 > 50) rtn = 0; //一半的數字沒有出現
else if (rtn < 80) rtn = Compare(aa1); //比較數字出現的前後順序
return rtn;
}
private static int Compare(int[] Num)
#region >>比較產生的順序'利用窮舉法、計算可能性<<
{
int rtn = 0;
int pa1 = 0;
int totalPa = 0;
//從頭比到尾中段、
int ilast = Num.Length - (int)(Num.Length / 4.0);
for (int ii = 0; ii < ilast; ii++)
{
if (Num[ii] != 0) //0表示沒出現、不用檢查
{//利用窮舉法、計算可能性
pa1 = Compare(Num, ii);
totalPa += pa1;
rtn = rtn > pa1 ? rtn : pa1;
if (totalPa >= 99) break;
}
}
return rtn;
}
#endregion
private static int Compare(int[] Num,int idx)
#region >>比較出現的順序、所以只會有0,1,2,3,4,5,6,7,8,9...<<
{
int rtn = 0;
int inum1 = Num[idx];
int pa1 = 0;
int idx1 = 0;
for (int ii = idx; ii < Num.Length; ii++)
{
if (inum1 + idx1 == Num[ii])
{
pa1++;
Num[ii] = 0;
}
idx1++;
}
rtn = (int)(pa1 / (double)Num.Length * 100);
return rtn;
}
#endregion
private static int Compare(int source,int index, int[] dest)
#region >>數字第一次出現的位置'從1開始<<
{
for (int ii = index; ii < dest.Length; ii++)
{
if (dest[ii] == source) return ii+1;
}
return 0;
}
#endregion
#endregion
===================
搞了C#
現在來學學維修筆電