Algorithm 将数字分组到最近的组中
例如,我有数字46、47、54、58、60和66。我想把它们分组,这样可以使分组的大小尽可能大。如果数字的值在正负10(含10)范围内,则将对其进行分组。因此,根据您从哪个数字开始,本例可能有三种结果(如图所示) 我想要的是第二个可能的结果,如果从54开始,就会出现,因为44到64之间的数字将被分组,剩下66个,并创建最大的组(5个项目) 我意识到我可以很容易地强行使用这个例子,但我确实有一个很长的数字列表,它需要跨越数千个数字。。有谁能告诉我应该阅读的算法或者给我一些建议吗Algorithm 将数字分组到最近的组中,algorithm,numbers,nearest-neighbor,Algorithm,Numbers,Nearest Neighbor,例如,我有数字46、47、54、58、60和66。我想把它们分组,这样可以使分组的大小尽可能大。如果数字的值在正负10(含10)范围内,则将对其进行分组。因此,根据您从哪个数字开始,本例可能有三种结果(如图所示) 我想要的是第二个可能的结果,如果从54开始,就会出现,因为44到64之间的数字将被分组,剩下66个,并创建最大的组(5个项目) 我意识到我可以很容易地强行使用这个例子,但我确实有一个很长的数字列表,它需要跨越数千个数字。。有谁能告诉我应该阅读的算法或者给我一些建议吗 您只需先对数组排序
您只需先对数组排序即可。然后,对于每个第i个数字,您可以进行二进制搜索,以找到第i个数字+20范围内最右边的数字,让最右边索引的位置为X。您必须找到所有第i个数字的最大值(X-i+1),我们完成了:) 运行时分析:此算法的运行时为O(NlgN),其中N是原始数组中的项数 一个更好的解决方案:假设我们有一个数组ar[],ar[]有N个项
正确性:由于数组是按非降序排序的,如果
i
和j
和ar[i]+20>ar[k]
那么ar[j]+20>ar[k]
也是如此。所以我们不需要检查这些项目,这些项目已经检查了前面的项目。这就是我想要做的。对不起,我没有解释清楚。每次迭代都会使用删除前一个最大组后留下的数字来查找可能的最大组。Matlab代码:
function out=groupNums(y)
d=10;
out=[];
if length(y)==1
out=y;
return
end
group=[];
for i=1:length(y)
group{i}=find(y<=y(i)+d & y>=y(i)-d);
end
[~,idx]=max(cellfun(@length,group));
out=[out,{y(group{idx})}];
y(group{idx})=[];
out=[out,groupNums(y)];
function out=groupNums(y)
d=10;
out=[];
如果长度(y)==1
out=y;
返回
结束
组=[];
对于i=1:长度(y)
群{i}=find(y=y(i)-d);
结束
[~,idx]=max(cellfun(@length,group));
out=[out,{y(群{idx}}];
y(群{idx})=[];
out=[out,groupNums(y)];
事实上,我想我知道怎么做了。我只需遍历并找到最大的组,然后将该组从列表中删除(并保存),然后再次递归调用该函数,每次删除/保存最大的组,直到找到散乱者。您所说的“最大可能的组大小”并不完全清楚。是基于平均数、中位数等。我想最大限度地增加分组中的项目数,而不管平均数是多少。所有的数字都是分组的,所以我还是不知道你在找什么。您想要最大的组,然后是剩余数字中最大的组,等等。?我认为这就是你的例子所暗示的。你需要更具体一点。最大组中的项目数是多少?我知道它已经过时了,但是您能给出一个在您的解决方案中有效的示例代码吗。这正是我需要的。非常感谢!我找到了第一段,但你的“更好的解决方案”仍然是个谜具体来说,你同时增加i和cur_指数?这让我很困惑。谢谢