所以今天我被问到在集合中找到结束匹配的最佳方法是什么。
例如,你有一个这样的数组:
1, 3, 8, 10, 13, ...
哪个数字最接近4?
集合是数字的,无序的,可以是任何东西。与要匹配的数字相同。
让我们从各种语言中看出我们能想出什么。
答案 0 :(得分:22)
J中的11个字节:
C=:0{]/:|@-
示例:
>> a =: 1 3 8 10 13
>> 4 C a
3
>> 11 C a
10
>> 12 C a
13
我对外行的故障:
0{ First element of
] the right argument
/: sorted by
| absolute value
@ of
- subtraction
答案 1 :(得分:19)
更短的Python:41个字符
f=lambda a,l:min(l,key=lambda x:abs(x-a))
答案 2 :(得分:9)
我在python中的尝试:
def closest(target, collection) :
return min((abs(target - i), i) for i in collection)[1]
答案 3 :(得分:5)
Groovy 28B
f={a,n->a.min{(it-n).abs()}}
答案 4 :(得分:5)
一些C#Linq ......有太多方法可以做到这一点!
decimal[] nums = { 1, 3, 8, 12 };
decimal target = 4;
var close1 = (from n in nums orderby Math.Abs(n-target) select n).First();
var close2 = nums.OrderBy(n => Math.Abs(n - target)).First();
Console.WriteLine("{0} and {1}", close1, close2);
如果使用列表,则会有更多方法,因为普通ol数组没有.Sort()
答案 5 :(得分:4)
假设值在一个名为T的表中以一个名为N的列开始,我们正在寻找值4,那么在Oracle SQL中它需要59个字符:
select*from(select*from t order by abs(n-4))where rownum=1
我使用select *来减少空白要求。
答案 6 :(得分:4)
因为我实际上需要这样做,这是我的PHP
$match = 33;
$set = array(1,2,3,5,8,13,21,34,55,89,144,233,377,610);
foreach ($set as $fib)
{
$diff[$fib] = (int) abs($match - $fib);
}
$fibs = array_flip($diff);
$closest = $fibs[min($diff)];
echo $closest;
答案 7 :(得分:4)
PostgreSQL:
select n from tbl order by abs(4 - n) limit 1
在两个记录共享“abs(4-id)”的相同值的情况下,输出将是不确定的,并且可能不是常量。为了解决这个问题,我建议使用未经测试的猜测:
select n from tbl order by abs(4 - n) + 0.5 * 4 > n limit 1;
此解决方案提供O(N log N)的性能,其中O(log N)是可能的,例如:https://stackoverflow.com/a/8900318/1153319
答案 8 :(得分:3)
def c(value, t_array)
t_array.min{|a,b| (value-a).abs <=> (value-b).abs }
end
ar = [1, 3, 8, 10, 13]
t = 4
c(t, ar) = 3
答案 9 :(得分:2)
我的Python和https://stackoverflow.com/users/29253/igorgue基于此处的其他一些答案。只有34个字符:
min([(abs(t-x), x) for x in a])[1]
答案 10 :(得分:2)
的PostgreSQL:
RhodiumToad在FreeNode上指出了这一点,其性能大约为O(log N)。比其他PostgreSQL答案要好得多。
select * from ((select * from tbl where id <= 4
order by id desc limit 1) union
(select * from tbl where id >= 4
order by id limit 1)) s order by abs(4 - id) limit 1;
两个条件应该是“或等于”,以便更好地处理id存在的情况。在两个记录共享“abs(4-id)”的相同值然后其他PostgreSQL回答的情况下,这也处理。
答案 11 :(得分:2)
上述代码不适用于浮动数字 所以这是我修改过的PHP代码。
function find_closest($match, $set=array()) {
foreach ($set as $fib) {
$diff[$fib] = abs($match - $fib);
}
return array_search(min($diff), $diff);
}
$set = array('2.3', '3.4', '3.56', '4.05', '5.5', '5.67');
echo find_closest(3.85, $set); //return 4.05
答案 12 :(得分:2)
Scala(62个字符),基于J和Ruby解决方案的想法:
def c(l:List[Int],n:Int)=l.sort((a,b)=>(a-n).abs<(b-n).abs)(0)
用法:
println(c(List(1,3,8,10,13),4))
答案 13 :(得分:2)
语言:C,字数:79
c(int v,int*a,int A){int n=*a;for(;--A;++a)n=abs(v-*a)<abs(v-n)?*a:n;return n;}
签名:
int closest(int value, int *array, int array_size);
用法:
main()
{
int a[5] = {1, 3, 8, 10, 13};
printf("%d\n", c(4, a, 5));
}
答案 14 :(得分:1)
Haskell,60个字符 -
f a=head.Data.List.sortBy(compare`Data.Function.on`abs.(a-))
答案 15 :(得分:1)
EDITED = for for循环
int Closest(int val, int[] arr)
{
int index = 0;
for (int i = 0; i < arr.Length; i++)
if (Math.Abs(arr[i] - val) < Math.Abs(arr[index] - val))
index = i;
return arr[index];
}
答案 16 :(得分:1)
Python,不确定如何格式化代码,并且不确定代码是否会按原样运行,但是它的逻辑应该可行,并且可能还有内置函数可以执行...
list = [1,4,10,20]
num = 7
for lower in list:
if lower <= num:
lowest = lower #closest lowest number
for higher in list:
if higher >= num:
highest = higher #closest highest number
if highest - num > num - lowest: # compares the differences
closer_num = highest
else:
closer_num = lowest
答案 17 :(得分:1)
在Java中使用可导航地图
NavigableMap <Integer, Integer>navMap = new ConcurrentSkipListMap<Integer, Integer>();
navMap.put(15000, 3);
navMap.put(8000, 1);
navMap.put(12000, 2);
System.out.println("Entry <= 12500:"+navMap.floorEntry(12500).getKey());
System.out.println("Entry <= 12000:"+navMap.floorEntry(12000).getKey());
System.out.println("Entry > 12000:"+navMap.higherEntry(12000).getKey());
答案 18 :(得分:1)
Kdb + ,23B:
C:{x first iasc abs x-}
用法:
q)a:10?20
q)a
12 8 10 1 9 11 5 6 1 5
q)C[a]4
5
答案 19 :(得分:1)
这是Haskell的另一个答案:
import Control.Arrow
near4 = snd . minimum . map (abs . subtract 4 &&& id)
答案 20 :(得分:1)
Haskell条目(已测试):
import Data.List
near4 = head . sortBy (\n1 n2 -> abs (n1-4) `compare` abs (n2-4))
通过将数字放在靠近前面的4附近来对列表进行排序。 head
获取第一个元素(最接近4)。
答案 21 :(得分:1)
红宝石
def c(r,t)
r.sort{|a,b|(a-t).abs<=>(b-t).abs}[0]
end
不是最有效的方法,但很短。
答案 22 :(得分:1)
只返回一个数字:
var arr = new int[] { 1, 3, 8, 10, 13 };
int numToMatch = 4;
Console.WriteLine("{0}",
arr.Select(n => new{n, diff = Math.Abs(numToMatch - n) }).OrderBy(x => x.diff).ElementAt(0).n);
答案 23 :(得分:1)
只返回一个数字:
var arr = new int[] { 1, 3, 8, 10, 13 };
int numToMatch = 4;
Console.WriteLine("{0}",
arr.OrderBy(n => Math.Abs(numToMatch - n)).ElementAt(0));
答案 24 :(得分:1)
Perl - 66个字符:
perl -e 'for(qw/1 3 8 10 13/){$d=($_-4)**2; $c=$_ if not $x or $d<$x;$x=$d;}print $c;'
答案 25 :(得分:0)
<强>红宝石即可。一次传递。很好地处理负数。也许不是很短,但肯定很漂亮。
class Array
def closest int
diff = int-self[0]; best = self[0]
each {|i|
if (int-i).abs < diff.abs
best = i; diff = int-i
end
}
best
end
end
puts [1,3,8,10,13].closest 4
答案 26 :(得分:0)
41个字符:
let C x = Seq.min_by (fun n -> abs(n-x))
,如
#light
let l = [1;3;8;10;13]
let C x = Seq.min_by (fun n -> abs(n-x))
printfn "%d" (C 4 l) // 3
printfn "%d" (C 11 l) // 10
printfn "%d" (C 12 l) // 13
答案 27 :(得分:0)
给定现有的Excel范围,rangeOfValues:
使用Application.Match查找Range中最接近的匹配值的索引(请注意,Match方法返回Double)
Dim iMatch as Double
iMatch = Application.Match(valueToMatch, rangeOfValues)
使用VLOOKUP / HLOOKUP
找到与目标值最接近的Range值Dim closest as Variant
closest = VLOOKUP(valueToMatch, rangeOfValues)
如果需要完全匹配:
Dim exactM as Variant
exactM = VLOOKUP(valueToMatch, rangeOfValues, False)
答案 28 :(得分:0)
另一个PHP回答:
function closestMatch($int, $in) {
$diffs = array();
foreach ($in as $i)
$diffs[abs($int - $i)] = $i;
ksort($diffs);
foreach ($diffs as $i) return $i;
}
答案 29 :(得分:0)
你们中的一些人似乎并没有读到列表是unordered
(尽管我可以理解你的混淆)。在Java中:
public int closest(int needle, int haystack[]) { // yes i've been doing PHP lately
assert haystack != null;
assert haystack.length; > 0;
int ret = haystack[0];
int diff = Math.abs(ret - needle);
for (int i=1; i<haystack.length; i++) {
if (ret != haystack[i]) {
int newdiff = Math.abs(haystack[i] - needle);
if (newdiff < diff) {
ret = haystack[i];
diff = newdiff;
}
}
}
return ret;
}
不完全简洁,但是它的Java。
答案 30 :(得分:0)
Common Lisp 。
(defun closest-match (list n)
(iter (for i in list)
(finding i minimizing (abs (- i n)))
答案 31 :(得分:0)
int numberToMatch = 4;
var closestMatches = new List<int>();
closestMatches.Add(arr[0]); // closest tentatively
int closestDifference = Math.Abs(numberToMatch - arr[0]);
for(int i = 1; i < arr.Length; i++)
{
int difference = Math.Abs(numberToMatch - arr[i]);
if (difference < closestDifference)
{
closestMatches.Clear();
closestMatches.Add(arr[i]);
closestDifference = difference;
}
else if (difference == closestDifference)
{
closestMatches.Add(arr[i]);
}
}
Console.WriteLine("Closest Matches");
foreach(int x in closestMatches) Console.WriteLine("{0}", x);
答案 32 :(得分:0)
Python + numpy
import numpy as np
f = lambda lst, target: lst[np.argmin(np.abs(np.array(lst) - target))]
示例:
>>> f([1,2,5,3,10],9)
10