首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >搜索算法

搜索算法
EN

Stack Overflow用户
提问于 2012-07-18 12:10:51
回答 2查看 160关注 0票数 0

我有一个包含10k记录的JSON。每个记录都有一个时间戳,其格式为'2011-04-29'。现在我有了一个客户端数组(让我们称之为我们的日历),其中包含了表单数组-

代码语言:javascript
复制
['2011-04-26', '2011-05-02', 'Week 1', '2010 - 11']
...

目标是为每个记录的时间戳分配一个星期号。我可以使用经典的线性搜索来完成这个任务,但是有了10k+ json记录和日历上将近300个星期的时间,这很快就变得乏味了。

你有什么推荐的?

我需要日历,因为这里的周不是一年中的实际一周,而是定义了其他地方。

如果我将字符串转换为Date.getTime(),是否有一种更有效的方法来做到这一点?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-18 12:17:56

只有300周的时间,我的方法是引入一个中间查找对象,将每个可能的时间戳匹配到适当的周。只需使用一个简单的循环,它将生成:

代码语言:javascript
复制
{
    '2011-04-26': 1,
    '2011-04-27': 1,
    // ...
    '2011-05-02': 1,
    '2011-05-03': 2,
    '2011-05-04': 2,
    // ...
}

这些值只是calendar数组中的索引。

然后,您可以将10K的记录分配给一个日历周,只需在这个对象中进行简单的查找。

票数 2
EN

Stack Overflow用户

发布于 2012-07-18 12:25:55

只要以某种方式对日历记录进行排序,就可以在其上应用二进制搜索算法。如果要将日期保存为时间戳而不是字符串,则可能会使比较更快(尽管对于当前格式,字符串比较也有效)。

用“周”索引你的日历可能会更优雅。有点像

代码语言:javascript
复制
{
  "Week 1": ['2011-04-26', '2011-05-02', '2010 - 11'],
  "Week 2": ['2011-05-03', '2011-05-09', '2010 - 12'],
  ...
}

请注意,从calendar数组创建这个查找对象的复杂性为O(n),因此,如果只需要搜索一条记录,即使对原始数组进行线性搜索也会更快。

原始数组的示例算法:

代码语言:javascript
复制
var calendar = [
  ['2011-04-26', '2011-05-02', 'Week 1', '2010 - 11'],
  ['2011-05-03', '2011-05-09', 'Week 2', '2010 - 12'],
  ...
];
function getRecord(date) {
    var l = 0,
        r = calendar.length-1;
    while (l <= r) {
        var m = ~~(l + (r-l)/2);
        var comp = comparefn(this[m]);
        if (calendar[m][1] < date) // last day of week before date
            l = m+1;
        else if (calendar[m][0] > date) // first day of week after date
            r = m-1;
        else // week found
            return calendar[m];
    }
    // I'm not quite sure what happens when a date lies between two weeks in the calendar
    return null;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11541060

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档