【发布时间】:2011-03-09 05:40:10
【问题描述】:
我有一个 几乎 排序值 28 个元素长的数组。我需要找到与提供给算法的目标值相加的一组值(或者如果找不到确切的总和,则最接近的总和低于目标值)。
我目前有一个简单的算法可以完成这项工作,但它并不总能找到最佳匹配。它在具有一组特定值的理想情况下工作,但我需要一个更强大、更准确的解决方案来处理更广泛的数据集。
算法必须用 C 而不是 C++ 编写,并且适用于嵌入式系统,因此请记住这一点。
这是我当前的算法供参考。它从可用的最高值开始迭代。如果当前值小于目标总和,则将该值添加到输出并从目标总和中减去。重复此过程,直到达到总和或用完值。它假定一个几乎升序的排序列表。
//valuesOut will hold a bitmask of the values to be used (LSB representing array index 0, next bit index 1, etc)
void pickValues(long setTo, long* valuesOut)
{
signed char i = 27;//last index in array
long mask = 0x00000001;
(*valuesOut) = 0x00000000;
mask = mask<< i;//shift to ith bit
while(i>=0 && setTo > 0)//while more values needed and available
{
if(VALUES_ARRAY[i] <= setTo)
{
(*valuesOut)|= mask;//set ith bit
setTo = setTo - VALUES_ARRAY[i]._dword; //remove from remaining }
//decrement and iterate
mask = mask >> 1;
i--;
}
}
更多参数:
值数组很可能按升序接近排序,但无法强制执行,因此假设没有排序。其实也可能有重复值。
数组很可能会保存一组值,这些值无法创建其范围内的每个总和。如果无法找到准确的总和,算法应返回创建下一个最低总和的值。
【问题讨论】:
-
集合中的数字是否不同? IE。同一个数字可以出现多次吗?
-
@torak 否。同一个数字可能会出现多次
-
@torak 值都是正数