【发布时间】:2014-03-14 00:05:56
【问题描述】:
我有一个恒定的基本列表,如下所示:
[50, 100, 150, 200, 500, 1000]
该列表定义了范围:0 到 50、50 到 100,一直到 1000 到无穷大。
我想编写一个函数,用于将任何数字列表转换为与上述兼容的列表。 “兼容”是指它只有该列表中的数字,但数字尽可能接近原始值。因此,对于[111, 255, 950] 的示例输入,我会得到[100, 200, 1000]。到目前为止,我有一个像这样工作的天真的代码:
for each i in input
{
calculate proximity to each number in base list
get the closest number
remove that number from the base list
return the number
}
这适用于大多数情况,但当输入比例失控时就会崩溃。当我有一个像[1000, 2000, 3000] 这样的输入时,第一个数字从基本列表中获取最后一个数字,然后 2000 和 3000 分别获得 500 和 200(因为已经采用了 1000 和 500)。这会产生一个向后列表[1000, 500, 200]。
我该如何防范呢?
【问题讨论】:
-
有效地找到最接近的值 - 很容易。这样做可以使每个数字最多使用一次 - 有点困难。
-
[1000, 500, 200] 有什么问题?差异的总和与 [200, 500, 1000] 相同,所以我看不出它是如何次优的。请定义您要优化的度量
-
如果我们按降序对输入进行排序并遵循您的流程会怎样。像 [3000,2000,1000] - 很明显你已经从你的基地的最后一个开始比较以获得更快的速度。
-
@NiklasB。问题是数字定义了范围,而我在向后列表中得到了负范围。
-
好的,所以你想要非递减订单。您希望最小化什么措施?
标签: algorithm list language-agnostic numbers