利用隨機化的思想比較兩個字符串是否相等

對於一般情況,只需利用java中String類型數據的equal方法就可以實現。但對於兩個非常長的位於信道兩端的長串來說,要比較他們的大小,需要將一個串傳至另一端,而將整個串傳輸不僅佔用信道帶寬且費時,故此採用隨機化的思想對該問題加以闡述。

任一字符串均可轉化爲二進制01串,因此僅考慮二進制01串的情形。首先分別求A B兩串對應的Int數,記爲I(x) I(y),任取一素數p,分別用I(x) I(y) 對p取模得Ip(x) Ip(y) ,易知此時Ip(x) Ip(y) 均爲小於p的整型數,將問題轉化爲比較Ip(x) Ip(y) 是否相等。若Ip(x) Ip(y) 不等,則x y必不等;若Ip(x) Ip(y) 相等,則x y可能相等也可能不等。原因在於,當|Ip(x)-Ip(y)|可被p整除時,即使x y不等,Ip(x) Ip(y) 也相等,爲降低此種情況概率,循環執行該過程,每次循環的p值隨機選擇,使得錯判概率成爲小概率事件。具體代碼如下:

public class CompareLongStrings {
	
	public CompareLongStrings() {
		// TODO Auto-generated constructor stub
	}
	
	public boolean CLongStrings(String a, String b) {
		boolean result = false;
		
		if(a.length() != b.length()){
			return result;
		}
		
		int aInt = Integer.parseInt(a);
		int bInt = Integer.parseInt(b);
		
		int iterator = 0;
		do {
			//隨機產生一組素數
			int p = GenerateSuShu.suShu(0, 100);
			
			int aIntModeP = aInt % p;
			int bIntModeP = bInt % p;
			
			if(aIntModeP != bIntModeP)
				return result;
			
			if(aIntModeP == bIntModeP){
				if(iterator >= 3){
					result = true;
					return result;
				}
			}
			iterator++;
				
		} while (iterator <=3);
		
		return result;
	}
}

import java.util.ArrayList;
import java.util.Random;


public class GenerateSuShu {
	
	public GenerateSuShu() {
		// TODO Auto-generated constructor stub
	}
	
	public static int suShu(int x, int y) {
		
		if(x<2)
			x = 2;
		
		ArrayList<Integer> arrayList = new ArrayList<>();
		for(int i=x;i<=y;i++){
			int j=2;
			for(;j<i;j++){
				if(i%j == 0)
					break;
			}
			if(j>=i)
				arrayList.add(i);
		}
		
		Random random = new Random();
		int index = random.nextInt(arrayList.size()-1-0)+0;
		return arrayList.get(index);
	}
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章