【问题标题】:How should I represent data for effective searching and comparing strings我应该如何表示数据以进行有效的搜索和比较字符串
【发布时间】:2013-03-27 02:04:11
【问题描述】:

我有两个长度为 300 的数组。它们看起来像这样(JSON 表示):

[
    [
        ["word1",0.000199],
        ["word2",0.000102],
          ...
        ["word15",0.000102]
    ],
      ...
    [
        ["anotherword1",0.0032199],
        ["anotherword2",0.032302],
          ...
        ["anotherword15",0.0320102]
    ]
]

我有这个蛮力算法:

for(var i = 0; i < 300; i++)
    {
        for(var j = 0; j < 15; j++)
        {
            for(var ii = i + 1; ii < 300; ii++)
            {
                for(var jj = 0; jj < 15; jj++)
                {
                    for(var jjj = 0; jjj < 15; jjj++)
                    {
                        if(new_keywords[i][j][0] === new_keywords[ii][jj][0] && new_keywords[ii][jj][0] === state_keywords[i][jjj][0])
                        {
                            console.log(0);
                        }
                    }
                }
            }
        }
}

我需要在这些数组中搜索相同的单词,如果单词相同,那么我将值相加并将 sum 除以 3 并在 state_keywords 数组中替换该值。因此,对于每个在数组中多次出现的单词,我都有其值的含义。

现在...我的方法非常糟糕,因为我现在有大约 3 亿次迭代,这太疯狂了。我需要在 JavaScript 中更好地实现我的数组。像字典树或 kd-tree 之类的东西。

谢谢。

编辑:

这里是http://jsfiddle.net/dD7yB/1/ 的例子。

EDIT2:

如果我不够清楚,我很抱歉。那么我在做什么:

  • 我有数组state_keywords。索引从 0 到 299,它们代表 themes...
  • 每个主题可以用 15 个单词表示,每次 new_keywords 数组到达时,它们可能会有所不同。
  • 当 new_keywords 数组到达时,我需要检查该数组中的每个单词是否位于同一主题索引上的 state_keywords 数组中。
  • 如果是:将概率相加并除以 2。
  • 如果不是:将新词添加到 state_keyword 数组中,但如果一个主题的词数超过 15 个(现在是),我只需要存储按概率排序的前 15 个词。

我需要尽可能有效地做到这一点,因为我需要每秒都这样做,所以它必须很快。

EDIT3:

现在我使用这个代码:

var i, j, jj, l;
for(i = 0; i < 300; i++)
{
    for(j = 0; j < 15; j++)
    {
        l = new_keywords[i].length;
        for(jj = 0; jj < l; jj++)
        {
            if(state_keywords[i][j][0] === new_keywords[i][jj][0])
            {  
                state_keywords[i][j][1] = (state_keywords[i][j][1] + new_keywords[i][jj][1]) / 2;
            }
        }
    }
}

这比上一个要快得多。

【问题讨论】:

  • 什么是“state_keywords”数组?
  • @Adidi state_keywords 是数组,我代表存储在这些数组中的单词的平均概率。单词可能会改变,我需要始终存储概率最高的单词。我不想简单地将state_keywords 数组替换为new_keywords.

标签: javascript performance data-structures


【解决方案1】:

你为什么不把这些数组做成对象,用字符串作为值的键呢?那你就直接查单词就可以了?

var wordlists = [
    {
        "word1":0.000199,
        "word2":0.000102,
          ...
        "word15":0.000102
    },
      ...
    {
        "anotherword1":0.0032199,
        "anotherword2":0.032302,
          ...
        "anotherword15":0.0320102
    }
]

然后用

查找
wordlists[0]["word2"]  //0.000102

【讨论】:

    猜你喜欢
    • 2021-08-01
    • 2017-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-21
    相关资源
    最近更新 更多