计算子字符串的最快方法是什么

时间:2010-05-28 13:36:34

标签: javascript string substring

我有一个巨大的“二进制”字符串,例如: 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),然后根据需要用零包装结果。我不确定这有多快。

你可能还有其他想法吗?

4 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

阵列已经完全符合您的需要,不是这样,除非您需要以二进制格式打印它。幸运的是,sprintf for javascript可用。