我正在使用带有标题的数组。每个标题索引对应于数据库中的一个 id,该数据库包含该给定标题的 html。

假设我有一个包含其中一个标题的字符串。

title = "why-birds-fly";
titles[] // an array which contains all the titles

要使用字符串“title”来获取相应的 id,我可以这样做:

for (i = 0; i < titles.length-1; i++) {
  if (titles[i] == title)
    return i+1;
}

我可以使用的另一种方法是创建一个关联数组和标题数组,这与标题完全相反。也就是说,它使用字符串作为索引并返回数字。

titles_id {blah:0,why-birds-fly:1,blah2:2}

然后我可以通过以下方式访问 ID:

return titles_id[title]+1;

考虑CPU、内存等,什么最有效?

另外,如果我的逻辑有问题,请告诉我。

谢谢威廉

有帮助吗?

解决方案

线性搜索方法具有复杂为O(n)的,我认为最差情况下,用于关联数组的方法可能是O(log n)的,(在最好的情况下也许O(1)如果JS引擎是使用哈希并获得没有冲突)。这将取决于一个JS引擎通常是如何实现关联数组/对象,但你可以相信这将击败为O(n)。

因此,第二种方法会更快,但当然会使用更多的存储器。这是一个非常典型的权衡,获得更多的速度,但是使用更多的内存,并且只你可以决定是否要作出这样的交易。

其他提示

考虑需要存储的键值对的数量也很重要。如果它小于~50(取决于实现),那么由于计算哈希值和解决冲突的成本,进行线性搜索将与进行哈希表查找一样有效。一个例外是 Google Chrome v8 JavaScript 引擎保留了所有对象的某种缓存版本,允许它直接查找对象上的属性,因此使用 Object 类作为哈希表可能会更快,尽管我不确定创建此缓存版本的成本是否会超过较小列表的好处。

可以使用阵列的功能的indexOf在第一种方法。

下面是从Mozilla开发者的信息: https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference:对象:阵列:的indexOf

的indexOf是JavaScript扩展,ECMA-262标准;因此它可以不存在在该标准的其他实现方式。您可以通过在你的脚本的开头插入下面的代码,允许其本身不支持ECMA-262实现的indexOf使用的解决这个问题。该算法是恰好在Firefox和SpiderMonkey的使用的方法。

if (!Array.prototype.indexOf)
{
  Array.prototype.indexOf = function(elt /*, from*/)
  {
    var len = this.length >>> 0;

    var from = Number(arguments[1]) || 0;
    from = (from < 0)
         ? Math.ceil(from)
         : Math.floor(from);
    if (from < 0)
      from += len;

    for (; from < len; from++)
    {
      if (from in this &&
          this[from] === elt)
        return from;
    }
    return -1;
   };
}

JavaScript数组可以使用一个值,例如标题为“为什么鸟飞”为索引。

〔实施例:   VAR标题= “为什么鸟飞”;

变种TitleArray [] =新的Array();

TitleArray [标题] = ID;

然后,你必须按标题的ID直接访问:

返回TitleArray [标题];

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top