9 个解决方案
#1
如果是我,可能会这样做:
1.针对数组的类型,选择最快的排序方式进行排序
2.排序后锁定所要找的数值的大致范围进行查找,因为排过序了,所以这个范围就很小了
仅供参考
1.针对数组的类型,选择最快的排序方式进行排序
2.排序后锁定所要找的数值的大致范围进行查找,因为排过序了,所以这个范围就很小了
仅供参考
#2
如果lz不懂算法,或者懒得想这些,懒人推荐 C# 或者 VB.NET,因为有 LINQ。
看代码:
9 11 9 12 8 12 7 7 14 6 5 4 3 3 17 2 18 1 20 21 21 30
看代码:
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
数字很大?
随即产生100万个整数,多不多?在P4 2.4C上运行,只需要2秒:
12345758 12346044 12349297 12341959 12352777 12352867 12335509 12333437 12332691
12332303
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.二分法查找
2.二分法查找
#6
没理解错的话,一个循环就够了吧:
机器上没vb,没测试,一种思路吧....
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.排序后锁定所要找的数值的大致范围进行查找,因为排过序了,所以这个范围就很小了
仅供参考
1.针对数组的类型,选择最快的排序方式进行排序
2.排序后锁定所要找的数值的大致范围进行查找,因为排过序了,所以这个范围就很小了
仅供参考
#2
如果lz不懂算法,或者懒得想这些,懒人推荐 C# 或者 VB.NET,因为有 LINQ。
看代码:
9 11 9 12 8 12 7 7 14 6 5 4 3 3 17 2 18 1 20 21 21 30
看代码:
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
数字很大?
随即产生100万个整数,多不多?在P4 2.4C上运行,只需要2秒:
12345758 12346044 12349297 12341959 12352777 12352867 12335509 12333437 12332691
12332303
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.二分法查找
2.二分法查找
#6
没理解错的话,一个循环就够了吧:
机器上没vb,没测试,一种思路吧....
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
同意楼上.