有一个已知长度2000的字典【上限字典】,Dictionary。
其中key依次为1~2000,value一定是key越大就越大,但没有规律可寻。
如 [1,5] [2,8], [3,9] [4,15] [5,21]……
含义为:key1的上限为5,只要目标数不超过5,方法就要返回1;key2的上限为8,只要目标数不超过8,方法就要返回2
……类推……key5的上限为21,只要目标数不超过21,方法就要返回5
[color=]现在需要一个方法,
[color=]传递一个目标数,匹配字典中符合条件的value并返回这个value对应的key(大于前一个key的value并小于本key的value就算符合条件)
举例:
指定一个数字12,可得出结果:这个数字比字典的key3的value大,但比key4的value小,则返回4
指定一个数字11,可得出结果同上,也是返回4
指定一个数字10,可得出结果还是同上,返回4
指定一个数字9, 可得出结果:这个数字刚好等于key3的value,返回3
我目前用的二分查找,跑一遍20万次的循环需要耗时700毫秒左右。
for (uint i = 1; i
{二分找目标(i);}
[C#] 纯文本查看 复制代码Dictionary 上限字典 = new(2000);
uint 二分找目标(uint 目标数)
{
uint 左边界 = 0;
uint 右边界 = (uint)上限字典.Count - 1;
uint 中分点 = (左边界 + 右边界) / 2;
uint 中分点值 = 上限字典[中分点];
while (左边界 目标数)
{
if (上限字典[中分点 - 1] 目标数)//如果比中分点对应的value大但比中分点+1对应的value小
{
return 上限字典.ElementAt((int)中分点).Key;
}
else if (上限字典[中分点 + 1] == 目标数)//如果刚好等于中分点+1的value
{
return 上限字典.ElementAt((int)中分点).Key;
}
else//否则更新左边界
{
左边界 = 中分点 + 1;
}
}
else//中分点对应的value刚好等于目标数
{
return 上限字典.ElementAt((int)中分点 - 1).Key;
}
中分点 = (左边界 + 右边界) / 2;
中分点值 = 上限字典[中分点];
}
return 1;}
需求:
现有方法效率太低,如何更高效率的完成这个查找方法(传递一个目标数,匹配字典中符合条件的value并返回这个value对应的key)。
任何C#语言写的高效方法都可以,不要求过程,只要足够高效并且能够正确获取结果就行。