我有一个字典(键是整数,值是浮点数)。我现在要求字典中的键的值是>比给定的数字但是<而不是下一个更大的关键。
示例:
dict = {100:0.0035,150:0.0024,200:0.0019}。
我给122,它应该给我0.0035
我给333,它应该给我0.0019
我给200,它应该给我0.0024
谢谢!
答案 0 :(得分:1)
这是二叉树的完美用例。对于堆栈溢出答案,这个主题有点宽泛,但无论如何都要进行。
function addValueToNode(tree, nodeidx, value) {
var left = 2*nodeidx + 1;
var right = 2*nodeidx + 2;
if(value > tree[nodeidx]) {
if(!tree[right])
tree[right] = value;
else
addValueToNode(tree, right, value);
} else {
if(!tree[left])
tree[left] = value;
else
addValueToNode(tree, left, value);
}
}
function addValueToTree(tree, value) {
if(tree.length == 0)
tree.push(value)
else
addValueToNode(tree, 0, value);
}
function addValuesToTree(tree, values) {
for(var i = 0; i < values.length; i++)
addValueToTree(tree, values[i]);
}
function addDictionaryToTree(tree, dict) {
var values = [];
for(var key in dict) {
values.push(key);
}
values.sort();
addValuesToTree(tree, values);
}
function findClosestValue(tree, nodeidx, value) {
var left = 2*nodeidx + 1;
var right = 2*nodeidx + 2;
if(value > tree[nodeidx]) {
if(!tree[right] || tree[right] == value)
return tree[nodeidx];
else
return findClosestValue(tree, right, value);
} else {
if(!tree[left])
return tree[nodeidx];
else
return findClosestValue(tree, left, value);
}
}
var tree = [];
var dict = {100: 0.0035, 150: 0.0024, 200: 0.0019};
addDictionaryToTree(tree, dict);
var closest = findClosestValue(tree, 0, 175);
var dictValue = dict[closest];
alert( closest + " : " + dictValue);
答案 1 :(得分:0)
var value = 122;
var min = null;
var minkey = null;
for ( var key : dict ) {
if (min==null || abs(value-key)<min) {
min=abs(value-key);
minkey = key;
}
}
return dict[minkey]
你可以试试这个。对不起,如果smth,我没有机会测试它。
答案 2 :(得分:0)
工作示例(在Firefox 3.6下测试):
<html>
<head>
<script type="text/javascript" src="jquery-1.3.2.min.js"></script>
<script type="text/javascript">
var dict = {100: 0.0035, 150: 0.0024, 200: 0.0019};
function r(aNum) {
var result;
for (var key in dict) {
var dist = key - aNum
if ((dist < 0 && dist < result) || result === undefined) {
result = key;
}
}
return dict[result];
}
$(document).ready(function() {
$('li').each(function() {
var id = $(this).attr('id').replace('n', '')
$(this).html(id + ": " + r(id));
});
});
</script>
</head>
<body>
<ul>
<li id="n122"></li>
<li id="n333"></li>
<li id="n200"></li>
</ul>
</body>
</html>
答案 3 :(得分:0)
以下功能符合您的要求:
function getNumber(dict, value) {
var key, found;
for (key in dict) {
if (value - key > 0) {
found = key;
}
}
return dict[found];
}
var dict = {100: 0.0035, 150: 0.0024, 200: 0.0019};
// Firebug assertions
console.assert(getNumber(dict, 122) == 0.0035);
console.assert(getNumber(dict, 333) == 0.0019);
console.assert(getNumber(dict, 200) == 0.0024);
答案 4 :(得分:0)
二进制搜索,使用修改的(稳定)算法搜索满足比较标准的最小元素。
答案 5 :(得分:-1)
如果您的字典不是很大,您可以尝试从(例如)(122-1)循环。如果它未定义,则减去1并再试一次,直到找到一些东西:)