以错误的方式将Set序列化为JSON

时间:2013-04-23 20:30:26

标签: json map set

我想要序列化为JSON的数据类型。数据类型包含一组整数。由于项目中的其他约束,使用除JSON之外的任何东西(例如,YAML)将是一件痛苦的事情,我真的想要O(1)查找。

我发现我可以在这里执行一个肮脏的小黑客并只使用一个JSON对象,并为每个键/值对中的值添加虚拟对象:

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

但我在短暂的在线搜索中看不到这方面的先例。好吧,这很可怕,是的,它浪费了记忆,但它似乎给了我想要的东西,而不必写一些愚蠢的包装。我搜索时没有立即遇到这种情况,这让我怀疑我错过了什么。

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

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

使用对象作为集合似乎完全合理,因为缺少另一个set数据类型。如果我是你,我会使用你提出的对象方法而不会有罪。

答案 2 :(得分: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。您不需要使用字符串作为键,您只需将数字用作键即可。我不知道哪种方式更快。<​​/ p>

答案 3 :(得分:0)

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