您的位置:首页 > 其它

利用随机化的思想比较两个字符串是否相等

2013-11-12 23:42 465 查看
对于一般情况,只需利用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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: