一个算法问题:从一组数中找出n组相似的数,求大家帮忙!

heochuan 2020-02-29 01:29:05
我现在要做一个功能,从一些图片当中找出几组相似的图片。
现在比较图片相似度的方法做完了,发现还要用到一个算法,怎么从一组图片中把相似的都分出来?

举个例子:
现在有一组图片,路径就用list存放吧。
我想要的结果就是一个返回一个list,里面包含了n个小list,每个小list里面是相似图片的路径。

假如有3组相似的图片,想要输出结果:
1.jpg,3.jpg,5.jpg,
2.jpg,6,jpg,
8.jpg,9,jpg,12,jpg,13.jpg,

不用排序,把相同的放到一组就行。
用什么算法能解决求大神帮帮忙!
...全文
702 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
我的思路:用Map来存储,类型是Map<String,List<String>>,看看map有没有图片路径,没有的话,map里面put(图片路径,List.add(图片路径)后的变量),然后,这个路径作为参考变量,放在一个List<String>里面,记作baseList,后面的图片和这个baseList里面的图片对比,相似的,放在对应map的list里面,不相似的,确定baseList没有这个变量(即baseList遍历完毕)后,在map里面put一个,然后baseList加上这个变量,最后,全部处理完了,获取map里面的values,实现分组
amouslion 2020-03-03
  • 打赏
  • 举报
回复
实现思路:把不同图片用不同的标识符进行标识,例如声明一个枚举,定几个枚举常量。每一个枚举常量标识一类图片。这样在编历时同通过不同枚举常量,就能判断出不同图片。就可以编历出不同类别图片。你可以试试看。
paullbm 2020-03-03
  • 打赏
  • 举报
回复
按楼主的需求写了个逻辑模拟的方式,供参考:

package csdn;

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

public class LikeGroup {

// 动态特征库
private ArrayList<String> listFeature = new ArrayList<String>();

// 由多个动态子分组构成的动态总分组
private ArrayList<ArrayList<String>> listsGroup = new ArrayList<ArrayList<String>>();

// 文件名称数组
private String[] filenames;
// = {
// "1.jpg","2.jpg","3.jpg"
// ,"4.jpg","5.jpg","6.jpg"
// ,"7.jpg","8.jpg","9.jpg"
// ,"10.jpg","11.jpg","12.jpg"
// ,"13.jpg","14.jpg","15.jpg"
// };

/**
* 无参构造函数 进行相应的初始化工作
*/
public LikeGroup() {
// 初始化文件名称数组
int fileTotal = 15;
filenames = new String[fileTotal];
for (int i = 0; i < fileTotal; i++) {
filenames[i] = (i + 1) + ".jpg";
}
}

// [真实方法]得到相似度对比后的下标值
// 根据文件名和特征库进行逐一对比
// 暂未使用:修改好后可替换[模拟方法]
private int getCompareIndex2(String filename) {
int size = this.listFeature.size();
int index = 0;
while (index < size) {
// TODO: 此处填写你的真实业务对比代码
//伪代码:if filename 能匹配特征库
//则break;提前结束循环
index++; //否则索引继续自增
}
return index;
}

// [模拟方法]得到相似度对比后的下标值
// 使用中:[真实方法]业务完善后可弃用
private int getCompareIndex(String filename) {
Random random = new Random();
int size = this.listFeature.size();

// 模拟相似度匹配代码
int index = random.nextInt(size + 1);
return index;
}

// 更新特征库和分组信息
private void updateFeatureAndGroup(String filename) {
int sizeBeforeUpdate = this.listFeature.size();
int indexCompared = getCompareIndex(filename);

if (indexCompared < sizeBeforeUpdate) {
// 在特征库中能找到匹配,则维护已存在的子分组
for (ArrayList<String> subGroup : this.listsGroup) {
if (this.listFeature.get(indexCompared).equals(subGroup.get(0))) {
subGroup.add(filename);
break;
}
}
} else {
// 由于在特征库中找不到匹配,所以更新特征库
this.listFeature.add(filename);
// 添加新的子分组
ArrayList<String> newSubGroup = new ArrayList<String>();
newSubGroup.add(filename);
this.listsGroup.add(newSubGroup);
}

//辅助观察
System.out.print("当前文件名是:"+filename);
System.out.print(", 比较后的索引值=" + indexCompared);
System.out.print(", 特征库更新前size="+sizeBeforeUpdate +", 更新后size="+this.listFeature.size());
System.out.println(", 当前特征库列表=" + this.listFeature);
}

// 拿所有的文件进行比较并分组
public void execute() {
this.listFeature.clear();
this.listsGroup.clear();
int lenFiles = this.filenames.length;
for (int i = 0; i < lenFiles; i++) {
String filename = this.filenames[i];
this.updateFeatureAndGroup(filename);
}
}

private void printResult() {
// 因为模拟方法getCompareIndex函数使用了随机数处理,
// 所以每次打印的结果是不一样的,但业务逻辑是相同的
System.out.println("最终特征库列表=" + this.listFeature);
System.out.println("共有" + this.listsGroup.size() + "个子分组,它们分别是:");
for (ArrayList<String> list : this.listsGroup) {
System.out.println(list);
}
}

public static void main(String[] args) {
LikeGroup lg = new LikeGroup();
lg.execute();
lg.printResult();
}
}
paullbm 2020-02-29
  • 打赏
  • 举报
回复
比较图片相似度的方法做完了。
怎么从一组图片中把相似的都分出来?
---------------
既然相似度的问题解决了,无非就是怎么设定相似度的分组问题了!
比如说首先是1.jpg和2.jpg比较,发现他们不相似,然后建立2个特征库,
然后拿3.jpg和特征库进行比较,发现和1.jpg相似,于是特征库保持不变,
5.jpg比较思路同3.jpg,特征库保持不变
6.jpg和2.jpg相信,特征库还是保持不变
8.jpg和特征库进行对比,发现和前2个都不相似,于是自成一派,建立第3个特征库
。。。
其它图片依次类推。。。

==============
所以,你的特征库怎么命名,就看你的喜好了,如果是我的话,我会在引发建立特征库时以第一张图片的名称来命名!

62,634

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧