Javascript JSON对象中的二进制搜索
我有一个JSON对象,如下所示:Javascript JSON对象中的二进制搜索,javascript,json,Javascript,Json,我有一个JSON对象,如下所示: "time1": { "item1": "val1", "item2": "val2" }, "time2": { "item1": "val3", "item2": "val4" } ... time*的值是以毫秒为单位的newdate()值,因此对time*值的顺序进行排序 现在我必须按时间搜索一个项目,如果键不存在,我必须取最近的值。 我在对象中有数千个条目,我正在考虑二进制搜索,但我不知道怎么做 我不能使用经典方法mid
"time1": {
"item1": "val1",
"item2": "val2"
},
"time2": {
"item1": "val3",
"item2": "val4"
}
...
time*
的值是以毫秒为单位的newdate()
值,因此对time*
值的顺序进行排序
现在我必须按时间搜索一个项目,如果键不存在,我必须取最近的值。
我在对象中有数千个条目,我正在考虑二进制搜索,但我不知道怎么做
我不能使用经典方法middle=(right+left)/2
,因为中间值可能是未定义的
。
我不能使用二叉树,因为我有一个我不能更改的已定义结构
谢谢以下是您如何读取数组中的
时间
后缀:
var json = {
"time1": {
"item1": "val1",
"item2": "val2"
},
"time2": {
"item1": "val3",
"item2": "val4"
}
}
var values = [];
for (var i in json) {
values += i.substring(4);
}
现在,您可以在
值
索引上进行二进制搜索。以下是如何仅读取数组中的时间
后缀:
var json = {
"time1": {
"item1": "val1",
"item2": "val2"
},
"time2": {
"item1": "val3",
"item2": "val4"
}
}
var values = [];
for (var i in json) {
values += i.substring(4);
}
现在,您可以对
值
索引进行二进制搜索。问题是,您可以对中位数进行未定义,但在最简单的形式下,您可以只使用中间键,json.length/2
,它不是最优的,但可以工作。
接下来,您必须进行二进制搜索,但也要保留每个步骤的位置索引。
基本上,您要检查的是索引,并根据每个索引处的值决定是向右移动还是向左移动。
如果你遇到了死胡同,搜索的时间就不存在了,你知道“邻居”,最后一次检查,If((time-to-u-search-json[index-1])>json[index+1]-time-to-u-search))
检查它离哪里更近,离index-1
或index+1
(这是O(1)
,所以你很好)最后,您可以返回json[index-1]
或json[index+1]
这对你有意义吗
加了一把小提琴
注意:这不是一个完整的小提琴问题是中位数可以是未定义的,但在最简单的形式下,您可以只使用中间键,
json.length/2
,它不是最优的,但可以工作。
接下来,您必须进行二进制搜索,但也要保留每个步骤的位置索引。
基本上,您要检查的是索引,并根据每个索引处的值决定是向右移动还是向左移动。
如果你遇到了死胡同,搜索的时间就不存在了,你知道“邻居”,最后一次检查,If((time-to-u-search-json[index-1])>json[index+1]-time-to-u-search))
检查它离哪里更近,离index-1
或index+1
(这是O(1)
,所以你很好)最后,您可以返回json[index-1]
或json[index+1]
这对你有意义吗
加了一把小提琴
注意:这不是一把完整的小提琴
var times = {
"1367999303810": { // today at 9:48am
"item1": "val1",
"item2": "val2"
},
"1368000000000": { // today at 10am
"item1": "val3",
"item2": "val4"
}
}
我会编写这样的代码(请修正数学!)
函数getNearest(findTime){
对于(var i=0;i=tArr[i])break;//精确定位
}
if(i==tArr.length)返回-1;//什么也没找到
if(i==tArr.length-1)返回tArr[i];//找到了终点
//在这里,查找时间大于一个数组项
var diff1=Math.abs(findTime-tArr[i]),//距离最后一个条目的距离
diff2=Math.abs(tArr[i+1]-findTime);//到下一个入口的距离
返回diff1==diff2?tArr[i+1]://返回最新时间
diff2>diff1?tArr[i]:tArr[i+1];//还是最近的
}
var-tArr=[];
对于(以时间表示的var t)tArr.push(parseInt(t));
tArr.sort();
var findTime=新日期(2013,4,8,9,50,0).getTime();//今天9点50分
var时间=getNearest(findTime);
if(time!=-1)window.console&&console.log(times[时间])
假设
var times = {
"1367999303810": { // today at 9:48am
"item1": "val1",
"item2": "val2"
},
"1368000000000": { // today at 10am
"item1": "val3",
"item2": "val4"
}
}
我会编写这样的代码(请修正数学!)
函数getNearest(findTime){
对于(var i=0;i=tArr[i])break;//精确定位
}
if(i==tArr.length)返回-1;//什么也没找到
if(i==tArr.length-1)返回tArr[i];//找到了终点
//在这里,查找时间大于一个数组项
var diff1=Math.abs(findTime-tArr[i]),//距离最后一个条目的距离
diff2=Math.abs(tArr[i+1]-findTime);//到下一个入口的距离
返回diff1==diff2?tArr[i+1]://返回最新时间
diff2>diff1?tArr[i]:tArr[i+1];//还是最近的
}
var-tArr=[];
对于(以时间表示的var t)tArr.push(parseInt(t));
tArr.sort();
var findTime=新日期(2013,4,8,9,50,0).getTime();//今天9点50分
var时间=getNearest(findTime);
if(time!=-1)window.console&&console.log(times[时间])
是否将值读入数组?(索引为timevalue-firstTimeValue
)你能给出一个“时间值*”的实际例子吗?一个JSFiddle.net会很棒。请记住,对象中属性的顺序是,因此在进行有意义的二进制搜索之前,你必须将其转换为数组。从这里开始,它非常简单。time*
值类似于1368000928818。例如,一些连续值是1368000928818、1368000938821、1368000948821和1368000958824。您可以看到,值之间没有共同的差异。“最近的值”或“匹配或下一个最低值”?后者稍微容易一些…将值读入数组?(索引为timevalue-firstTimeValue
)你能给出一个“时间值*”的实际例子吗?一个JSFiddle.net会很棒。请记住,对象中属性的顺序是,因此在进行有意义的二进制搜索之前,你必须将其转换为数组。从这里开始,它非常简单。time*
值类似于1368000928818。例如,一些连续值是1368000928818、1368000938821、1368000948821和1368000958824。您可以看到,值之间没有共同的差异。“最近的值”或“匹配或下一个最低值”?后者稍微容易一些……这是有道理的,但是json.length返回未定义的
对,您必须使用