在单个列表中比较字符串的最有效方法
Most efficient way of comparing Strings in a single list
所以我有一个包含超过 500 万个散列的文本文件,并被要求找到一对具有最常见字符的散列。字符必须在同一索引处匹配。
例如:
哈希 1 = B79F56435...
哈希 2 = B79123456...
结果= 4个匹配字符
*每个哈希总共包含64个十六进制字符
我在 Python 开始解决这个问题,但显然花了很长时间,所以我转到 java,这大大加快了这个过程。这是我当前的代码:
我将散列的文本文件导入到字符串的 ArrayList 中:
ArrayList<String> hashes = new ArrayList<>();
我比较ArrayList中每个String的主要方法
String winner1 = "", winner2 = "";
int count = 0, n = hashes.size();
for(int i = 0; i < n; i++)
{
s1 = hashes.get(i);
for(int j = i+1; j < n; j++)
{
s2 = hashes.get(j);
int temp = countComparisons(s1, s2);
if(temp > count)
{
count = temp;
winner1 = s1; winner2 = s2;
}
}
}
这是我计算哈希值比较的方法:
public static int countComparisons(String s1, String s2)
{
int x = 0;
for(int i = 0; i < 64; i++)
{
if(s1.charAt(i) == s2.charAt(i))
x++;
}
return x;
}
现在,将这些哈希全部单独相互比较将等于超过 12 万亿个组合,因此这显然需要很长时间,但我只是想看看是否有人可以对此代码进行任何改进。
我完全愿意接受有关如何改进的任何建议。
它也不一定必须在 java 中,任何关于使用哪种最佳数据结构的建议都会很棒。我之所以选择 ArrayList,是因为它很容易从文本文件中导入。
我发现很难找到针对此特定案例的比较算法,因此如果有人向我指出与此相关的任何内容,那也将非常有用。
谢谢
您必须以多步方式进行比较以减少时间。为此使用 ExecutorService。我想这个话题对你有帮助:
所以我有一个包含超过 500 万个散列的文本文件,并被要求找到一对具有最常见字符的散列。字符必须在同一索引处匹配。
例如:
哈希 1 = B79F56435...
哈希 2 = B79123456...
结果= 4个匹配字符
*每个哈希总共包含64个十六进制字符
我在 Python 开始解决这个问题,但显然花了很长时间,所以我转到 java,这大大加快了这个过程。这是我当前的代码:
我将散列的文本文件导入到字符串的 ArrayList 中:
ArrayList<String> hashes = new ArrayList<>();
我比较ArrayList中每个String的主要方法
String winner1 = "", winner2 = "";
int count = 0, n = hashes.size();
for(int i = 0; i < n; i++)
{
s1 = hashes.get(i);
for(int j = i+1; j < n; j++)
{
s2 = hashes.get(j);
int temp = countComparisons(s1, s2);
if(temp > count)
{
count = temp;
winner1 = s1; winner2 = s2;
}
}
}
这是我计算哈希值比较的方法:
public static int countComparisons(String s1, String s2)
{
int x = 0;
for(int i = 0; i < 64; i++)
{
if(s1.charAt(i) == s2.charAt(i))
x++;
}
return x;
}
现在,将这些哈希全部单独相互比较将等于超过 12 万亿个组合,因此这显然需要很长时间,但我只是想看看是否有人可以对此代码进行任何改进。
我完全愿意接受有关如何改进的任何建议。
它也不一定必须在 java 中,任何关于使用哪种最佳数据结构的建议都会很棒。我之所以选择 ArrayList,是因为它很容易从文本文件中导入。
我发现很难找到针对此特定案例的比较算法,因此如果有人向我指出与此相关的任何内容,那也将非常有用。
谢谢
您必须以多步方式进行比较以减少时间。为此使用 ExecutorService。我想这个话题对你有帮助: