怎样在一数组中找到与一数值最相近的数

时间:2021-08-07 10:09:26
怎样快速在一数组中找到与一数值最相近的数,而且数组很大。

9 个解决方案

#1


如果是我,可能会这样做:
1.针对数组的类型,选择最快的排序方式进行排序
2.排序后锁定所要找的数值的大致范围进行查找,因为排过序了,所以这个范围就很小了
仅供参考

#2


如果lz不懂算法,或者懒得想这些,懒人推荐 C# 或者 VB.NET,因为有 LINQ。
看代码:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {        
        static void Main(string[] args)
        {
            int[] array = new int[] { 12, 3, 7, 4, 2, 5, 3, 9, 11, 14, 8, 21, 1, 17, 12, 18, 21, 20, 7, 6, 9, 30 };
            int near = 10;
            var result = (from x in array select new { Key = x, Value = Math.Abs(x - near) }).OrderBy(x => x.Value);
            result.ToList().ForEach(x => Console.Write(x.Key + " "));
        }
    }
}


9 11 9 12 8 12 7 7 14 6 5 4 3 3 17 2 18 1 20 21 21 30

#3


数字很大?

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {        
        static void Main(string[] args)
        {
            Random r = new Random();
            int[] array = new int[1000000];
            for (int i = 0; i < 1000000; i++)
                array[i] = r.Next(0, 2147483647);
            int near = 12345678; // 假设我们找最接近12345678的数。
            var result = (from x in array.AsParallel() select new { Key = x, Value = Math.Abs(x - near) }).OrderBy(x => x.Value).Take(10); // 太多了,按照接近程度 take 10 个。
            result.ToList().ForEach(x => Console.Write(x.Key + " "));
        }
    }
}

随即产生100万个整数,多不多?在P4 2.4C上运行,只需要2秒:

12345758 12346044 12349297 12341959 12352777 12352867 12335509 12333437 12332691
 12332303

#4


我是来学习linq的

#5


1.快速排序
2.二分法查找

#6


没理解错的话,一个循环就够了吧:

    dim a
    dim n as long
    dim Idx as long,dim i as long
    
    a=array(-2,-30,1,3,5,9,10,34,21,11,15,-15,-6)
    n=16   '找最接近16的数
    for i=1 to ubound(a)
        if abs(n-a(i))< abs(n- a(Idx)) then Idx=i
    next
    debug.? Idx; a(Idx)    '输出最接近的值的数组下标和值


机器上没vb,没测试,一种思路吧....

#7


如果数据是固定的而且经常有这需求的建议排序后再存储,下次的话用二分法定位,这样来得快。
就目前的用一个循环即可,你的实际问题“最相近的数”转化过来也就是与其求绝对值最小的数

#8


如果是多次查找那么建议先排序,再查找。
但如果是只找一次,那么就没有必要排序了

只需要把每个元素和这个值相减求绝对值,然后对比前一个,如果绝对值更小,那么就记录下这个元素,依此类推

#9


同意楼上.

#1


如果是我,可能会这样做:
1.针对数组的类型,选择最快的排序方式进行排序
2.排序后锁定所要找的数值的大致范围进行查找,因为排过序了,所以这个范围就很小了
仅供参考

#2


如果lz不懂算法,或者懒得想这些,懒人推荐 C# 或者 VB.NET,因为有 LINQ。
看代码:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {        
        static void Main(string[] args)
        {
            int[] array = new int[] { 12, 3, 7, 4, 2, 5, 3, 9, 11, 14, 8, 21, 1, 17, 12, 18, 21, 20, 7, 6, 9, 30 };
            int near = 10;
            var result = (from x in array select new { Key = x, Value = Math.Abs(x - near) }).OrderBy(x => x.Value);
            result.ToList().ForEach(x => Console.Write(x.Key + " "));
        }
    }
}


9 11 9 12 8 12 7 7 14 6 5 4 3 3 17 2 18 1 20 21 21 30

#3


数字很大?

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {        
        static void Main(string[] args)
        {
            Random r = new Random();
            int[] array = new int[1000000];
            for (int i = 0; i < 1000000; i++)
                array[i] = r.Next(0, 2147483647);
            int near = 12345678; // 假设我们找最接近12345678的数。
            var result = (from x in array.AsParallel() select new { Key = x, Value = Math.Abs(x - near) }).OrderBy(x => x.Value).Take(10); // 太多了,按照接近程度 take 10 个。
            result.ToList().ForEach(x => Console.Write(x.Key + " "));
        }
    }
}

随即产生100万个整数,多不多?在P4 2.4C上运行,只需要2秒:

12345758 12346044 12349297 12341959 12352777 12352867 12335509 12333437 12332691
 12332303

#4


我是来学习linq的

#5


1.快速排序
2.二分法查找

#6


没理解错的话,一个循环就够了吧:

    dim a
    dim n as long
    dim Idx as long,dim i as long
    
    a=array(-2,-30,1,3,5,9,10,34,21,11,15,-15,-6)
    n=16   '找最接近16的数
    for i=1 to ubound(a)
        if abs(n-a(i))< abs(n- a(Idx)) then Idx=i
    next
    debug.? Idx; a(Idx)    '输出最接近的值的数组下标和值


机器上没vb,没测试,一种思路吧....

#7


如果数据是固定的而且经常有这需求的建议排序后再存储,下次的话用二分法定位,这样来得快。
就目前的用一个循环即可,你的实际问题“最相近的数”转化过来也就是与其求绝对值最小的数

#8


如果是多次查找那么建议先排序,再查找。
但如果是只找一次,那么就没有必要排序了

只需要把每个元素和这个值相减求绝对值,然后对比前一个,如果绝对值更小,那么就记录下这个元素,依此类推

#9


同意楼上.