我应该如何表示有效搜索和比较字符串的数据

时间:2013-03-27 02:04:12

标签: javascript performance data-structures

我有两个长度为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数组中替换该值。因此,对于每个在数组中超过一次的单词,我都有其值的含义。

现在......我的方法非常糟糕,因为我现在有大约300万次迭代,这很疯狂。我需要在JavaScript中更好地实现我的数组。像lexikographical树或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;
            }
        }
    }
}

比前一个快得多。

1 个答案:

答案 0 :(得分:2)

为什么不将这些数组转换为具有字符串作为值的键的对象?然后你可以直接查找单词并获取值?

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