C# 给定对象列表,提取大小相似的N个对象

C# 给定对象列表,提取大小相似的N个对象,c#,java,algorithm,pattern-matching,C#,Java,Algorithm,Pattern Matching,我有一个2D空间中的对象列表,当然,每个对象都有一个XY位置,一个宽度和高度 我想提取N个大小最相似的对象 例如: Size Object 1 : 100 (10 W x 10 H) Size Object 2 : 150 Size Object 3 : 140 Size Object 4 : 160 Size Object 5 : 140 在这种情况下,对于N=4,返回列表将是:Objects:{2,3,4,5} 我的想法是计算平均尺寸,然后一个接一个地得到最接近平均值的物体。 但当

我有一个2D空间中的对象列表,当然,每个对象都有一个XY位置,一个宽度和高度

我想提取N个大小最相似的对象

例如:

Size Object 1 : 100 (10 W x 10 H)

Size Object 2 : 150

Size Object 3 : 140

Size Object 4 : 160

Size Object 5 : 140
在这种情况下,对于N=4,返回列表将是:
Objects:{2,3,4,5}

我的想法是计算平均尺寸,然后一个接一个地得到最接近平均值的物体。 但当有大型物体的平均值上升时,这种方法就失败了

有什么建议吗


谢谢大家!

蛮力是创建一组从最小值到最大值的存储桶(列表数组)。从增量1开始。循环遍历每个元素,并将其放入从val-delta到val+delta的每个桶中。确定任何铲斗是否有n个元素。如果没有,则将增量增加1并重复


另一个(可能更好的选择)。按大小排序。从一个像1这样的小maxdelta开始。然后看看每个元素(i)和元素(i+n)。如果i&i+n的增量小于maxdelta,则这是您的集合(或者至少是集合的开始,因为可能有其他元素)。如果不是增量i。如果未找到集合,则增量maxdelta并重复。

第一步是按大小对输入数组进行排序。然后,遍历数组,同时保留一组运行的“最相似”元素,不管您如何定义它。假设一个由N个元素组成的集合是“最相似的”,如果它最小化集合中最小元素和最大元素之间的差异,那么您的算法将如下所示

Deque leastSet = new LinkedList(); // use a Deque instead of a Set because order is important, and presumably your inputArray doesn't contain duplicates anyway; if the input may contain duplicates, then use a LinkedHashSet instead
Deque currentSet = new LinkedList();

// initialize deques with first N elements
for(int i = 0; i < N; i++) {
    leastSet.addLast(inputArray[i]);
    currentSet.addLast(inputArray[i]);
}

for(int i = N; i < inputArray.length; i++) {
    currentSet.removeFirst();
    currentSet.addLast(inputArray[i]);
    if((currentSet.peekLast() - currentSet.peekFirst()) < (leastSet.peekLast() - leastSet.peekFirst())) {
        leastSet = currentSet.clone();
    }
}
Deque leastSet=new LinkedList();//使用Deque而不是集合,因为顺序很重要,而且您的输入阵列可能不包含重复项;如果输入可能包含重复项,则改用LinkedHashSet
Deque currentSet=新链接列表();
//使用前N个元素初始化DEQUE
对于(int i=0;i
你想在C#或Java上实现这一点吗?几何平均数或算术平均数差异的均方数?机器学习的整个部分都致力于研究这个问题:--你可能只需要做简单的K-均值聚类或期望最大化(EM)。对于任何输入,如果没有更详细的答案说明,这是我能做到的最具体的答案。通过对列表进行排序并单步遍历,这可能非常容易做到,但您可能需要更具体地说明您希望如何定义相似性。需要更多有关这方面的信息。更多信息。如果您只想比较总“体积”,那么这只是一个简单的检查。我们需要有关此问题的更多信息以提供帮助。使用Deque而不是集合,因为次序很重要。您也可以使用
LinkedHashSet
来处理作业。+1如果输入包含重复项,并且重复项出现在N的集合的边缘,则不包括在内。因此,您只需要检查集合上边缘的元素,看看它们是否与集合中最后一个元素重复。是的,我认为获得集合中极限元素的最小差值非常好!不管怎样,这个列表不包含重复项。我刚刚实现了这个解决方案,工作起来像个傻瓜。非常感谢。也感谢@Dukeling。