在我的程序中,我基本上有一个类似的方法:
for (int x=0; x<numberofimagesinmyfolder; x++){
for(int y=0; y<numberofimagesinmyfolder; y++){
compare(imagex,imagey);
if(match==true){
System.out.println("image x matches image y");
}
}
}
所以基本上我有一个图像文件夹,我比较了图像的所有组合......所以将图像1与所有图像进行比较,然后比较图像2 ...依此类推。我的问题是在搜索什么图像匹配时,需要很长时间。我试图多线程这个过程。有没有人知道如何做到这一点?
答案 0 :(得分:8)
不是每次都比较图像,而是散列图像,保存散列,然后比较每对消息的散列。由于哈希值要小得多,因此可以更加适合内存和缓存,这样可以大大加快比较速度。
也许有一种更好的方法来搜索相等性,但是一种选择是将所有哈希值粘贴到数组中,然后按哈希值对它们进行排序。然后迭代列表,查找相等的相邻条目。这应该是O(n*log(n))
而不是O(n^2)
,就像您当前的版本一样。
答案 1 :(得分:3)
以下是执行多线程的一些通用代码:
public static class CompareTask implements Runnable {
CountDownLatch completion;
Object imgA;
Object imgB;
public CompareTask(CountDownLatch completion, Object imgA, Object imgB) {
this.completion = completion;
this.imgA = imgA;
this.imgB = imgB;
}
@Override
public void run() {
// TODO: Do computation...
try {
System.out.println("Thread simulating task start.");
Thread.sleep(500);
System.out.println("Thread simulating task done.");
} catch (InterruptedException e) {
e.printStackTrace();
}
completion.countDown();
}
}
public static void main(String[] args) throws Exception {
Object[] images = new Object[10];
ExecutorService es = Executors.newFixedThreadPool(5);
CountDownLatch completion = new CountDownLatch(images.length * (images.length - 1) / 2);
for (int i = 0; i < images.length; i++) {
for (int j = i + 1; j < images.length; j++) {
es.submit(new CompareTask(completion, images[i], images[j]));
}
}
System.out.println("Submitted tasks. Waiting...");
completion.await();
System.out.println("Done");
es.shutdown();
}