【问题标题】:What is the fastest method to calculate substring计算子串最快的方法是什么
【发布时间】:2011-02-25 03:26:59
【问题描述】:

我有一个巨大的“二进制”字符串,例如:1110 0010 1000 1111 0000 1100 1010 0111 ....

它的长度是0模4,可能达到500,000。

我也有对应的数组:{14, 2, 8, 15, 0, 12, 10强>, 7, ...}

(数组中的每个数字对应字符串中的4位)

给定这个字符串、这个数组和一个数字N,我需要计算以下子字符串string.substr(4*N, 4),即:

对于N=0,结果应该是1110

对于N=1,结果应该是0010

我需要多次执行这个任务,我的问题是计算这个子字符串最快的方法是什么?

一种方法是直接计算子字符串:string.substr(4*N, 4)。恐怕这个对于这么大的字符串效率不高。

另一种方法是使用array[N].toString(2),然后在需要时用零包装结果。我不确定这有多快。

你还有其他想法吗?

【问题讨论】:

  • 我不知道你从哪里得到 substr 不快的概念。我不确定您的要求,但在一个简单的测试中,我制作了一个包含 500,000 个字符的字符串,然后在大约 169 毫秒内从中进行了 100,000 次随机子选择。

标签: javascript string substring


【解决方案1】:

字符串从何而来?为什么不将字符串表示为二进制而不是十六进制,然后您可以将每个四位二进制数字部分存储为单个字符? (如果你愿意的话,显然你可以把它打包两倍,或者实际上我现在想起来,四倍,因为 Javascript 字符串是 16 位 Unicode)。然后查找单个组将是对“charAt()”的单个调用,您只需通过查找表扩展为二进制形式。

edit — 哦,好吧,你已经有了一个数组。在这种情况下,根本不做子字符串工作;这很疯狂。只需抓取数组元素并通过查找数组将其转换为 4 位二进制字符串。

【讨论】:

    【解决方案2】:

    数组已经有你需要的了,不是吗,除了你需要以二进制格式打印它。幸运的是,sprintf for javascript 可用。

    【讨论】:

      【解决方案3】:

      如果你想要填充,你可以这样做:

      var elem = array[N]
      var str = "" + ((elem>>3)&1) + ((elem>>2)&1) + ((elem>>1)&1) + (elem&1);
      

      【讨论】:

      • ??他说他有一个字符串,而不是一个数组。您的代码假定一个数字数组。此外,您还可以反向获取二进制字符串。
      • I have also a corresponding array ...。不过,关于位的方向很好。
      • @Josh 不,在 Javascript 中它们不完全是数组。它们没有数组拥有的方法。
      • 但是,OP 说他有一个数组和一个字符串。
      • @Pointy True,但我不明白这与 OP 的担忧有何关系
      【解决方案4】:

      您可以考虑将大字符串表示为Rope 数据结构。绳索基本上是一棵二叉树,其叶子是字符数组。树中的一个节点有一个左孩子和一个右孩子,左孩子是字符串的第一部分,而右孩子是最后一部分。

      通过使用绳子,子字符串操作在复杂性上变为对数,而不是线性,因为它们对于常规字符串。

      【讨论】:

      • 如果他要这样拆分字符串,为什么不把它拆分成一个平面数组呢?那么他的查找是恒定时间,甚至不是对数。
      • @Pointy 如果他是一个数组,而不是一个字符串,那就可以了。但是将字符串拆分为数组仍然需要调用 substring 来获取各个部分。
      猜你喜欢
      • 2017-06-27
      • 2011-03-12
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多