1

我有一个想要序列化为 JSON 的数据类型。数据类型包含一组整数。由于项目中的其他限制,使用 JSON 以外的任何东西(例如,YAML)都会很痛苦,我真的想要 O(1) 查找。

我突然想到,我可以在这里执行一个肮脏的小技巧,只使用一个 JSON 对象,每个键/值对中的值都有虚拟对象:

{"1": null, "45": null, "-93": null}

但我在简短的在线搜索中没有看到这方面的先例。好的,这很可怕,是的,它在浪费内存,但它似乎可以提供我想要的东西,而无需编写一些愚蠢的包装器。我在搜索时不会立即遇到这种情况,这一事实让我怀疑我遗漏了一些东西。

那么,除了我上面提到的丑陋和记忆愚蠢之外,还有其他理由可以避免这种情况吗? (当然,我理所当然地认为目标语言中对象类型的底层实现对键有 O(1) 检查)。

4

4 回答 4

1

鉴于缺少另一种集合数据类型,将对象用作集合似乎完全合理。如果我是你,我会毫无愧疚地使用你提出的对象方法。

于 2013-05-20T18:06:32.730 回答
1

JSON 是一种“轻量级数据交换格式”,而不是查询数据结构。如果您要传输大量数据,那么一个简单的数字数组将占用比您上面提到的 JSON 少得多的空间。然后你可以将它转换成你以后需要的任何数据结构,它不需要符合 JSON 规范。使用您的键/值对格式传输较大文件的时间可能远远超过之后转换结构的时间。

于 2013-04-26T15:15:14.753 回答
0

你可以把它们放在一个排序的数组中,并使用这个 underscore.js 函数进行二进制搜索: http ://underscorejs.org/#indexOf

例子:

var array = [1, 45, -93, 20, 17];
var sorted = array.sort();

alert(_.indexOf(sorted, 17, true) >= 0)
alert(_.indexOf(sorted, 18, true) >= 0)

你也可以做你最初的想法,但你不需要把它写成 JSON。您不需要使用字符串作为键,您可以只使用数字作为键。我不知道哪种方式更快。

于 2013-04-23T21:17:37.770 回答
0

在写这个问题时我没有想到的一件事是将数字转换为字符串并可能在查找时散列它的费用。当然,这仍然是集合大小的O(1),但我认为在所有这些字符串操作加起来小于O(log(n))二进制文件之前, n必须相当大搜索整数数组。

于 2013-04-24T15:42:21.217 回答