在随机集中查找最接近的数字

时间:2009-12-10 15:10:18

标签: algorithm math set

假设我在0到100之间有一组10个随机数。

操作员还给我一个0到100之间的随机数。 然后我得到了集合中与操作员给我的数字最接近的数字。

例如

set = {1,10,34,39,69,89,94,96,98,100}

运营商编号= 45

return = 39

如何将其转换为代码? (javascript或其他)

6 个答案:

答案 0 :(得分:7)

如果set是有序的,则进行二分查找以找到最接近的值(或2个值)。然后区分哪两个最接近...减去?

如果set没有被排序,只需遍历集合,(排序它本身需要多次传递),并且对于每个成员,检查差异是否小于您到目前为止看到的最小差异,如果是,则将其记录为新的最小差异,并将该数字记录为新的候选答案。 。

  public int FindClosest(int targetVal, int[] set)
  {
      int dif = 100, cand = 0;
      foreach(int x in set)
          if (Math.Abs(x-targetVal) < dif)
          {
              dif = Math.Abs(x-targetVal);
              cand = x;
          }
      return cand;
  }

答案 1 :(得分:5)

  • 给定一个名为input的数组,创建另一个大小相同的数组
  • 此新数组的每个元素都是Math.abs(input[i] - operatorNumber)
  • 选择mininum元素的索引(让我们称之为k
  • 您的回答是input[k]

<强> NB

  • 不需要排序
  • 你可以在没有额外数组
  • 的情况下完成

JavaScript中的示例实现

function closestTo(number, set) {
    var closest = set[0];
    var prev = Math.abs(set[0] - number);

    for (var i = 1; i < set.length; i++) {
        var diff = Math.abs(set[i] - number);

        if (diff < prev) {
            prev = diff;
            closest = set[i];
        }
    }

    return closest;
}

答案 2 :(得分:1)

这个怎么样:

1)将集合放入二叉树中 2)将操作员编号插入树中 3)返回运算符父级

答案 3 :(得分:1)

  1. 订购套装
  2. 二进制搜索输入
  3. 如果您在两个元素之间结束,请检查差异,然后返回差异最小的元素。

答案 4 :(得分:1)

有人在Mathematica上标记了这个问题,所以这是一个Mathematica答案:

set = {1,10,34,39,69,89,94,96,98,100};

opno = 45;

set[[Flatten[
  Position[set - opno, i_ /; Abs[i] == Min[Abs[set - opno]]]]]]

当有多个元素的元素与运算符编号相等时,它可以工作。

答案 5 :(得分:0)

python示例:

#!/usr/bin/env python
import random
from operator import itemgetter

sample = random.sample(range(100), 10)
pivot = random.randint(0, 100)

print 'sample: ', sample
print 'pivot:', pivot
print 'closest:', sample[
    sorted(
        map(lambda i, e: (i, abs(e - pivot)), range(10), sample), 
        key=itemgetter(1)
    )[1][0]]

# sample:  [61, 2, 3, 85, 15, 18, 19, 8, 66, 4]
# pivot: 51
# closest: 66