我想存储一个包含属性event_timestamp
的对象数组,其中包含事件时间戳的Date()
对象。
我想提供一个来自Date
的对象和一个Date
对象,并收集该范围内的所有对象。
我不想迭代所有数组,我想要更快的东西...例如O(Log N)
或其他任何东西。
是否有类似javascript实现的东西?是否有第三方库提供O(Log N)
或其他任何快速方法的搜索?
非常感谢有关该问题的任何信息。
谢谢!
感谢您迄今为止的回复。
我的情况是我有一个包含图表的仪表板。现在用户可以搜索示例..给我最后15分钟的结果。然后服务器提供具有相关结果的行,结果中的每一行都包含一个名为event_timestamp
的属性,其中包含Date
对象。
现在,如果用户在5分钟后再次搜索最后15分钟,那么这意味着他之前已经查询过的前10分钟,所以我想缓存它并仅从最后一个服务器发送请求5分钟。
所以每当用户查询服务器时,我都会接受响应并使用以下步骤解析它:
向数组追加以下对象:
{ 行:行, fromDate:firstRowDate, toDate:lastRowDate }
现在..在上一个示例中,用户首先查询15分钟,并在5分钟后再次查询15分钟。这意味着我在对象中有10个宝贵的数据分钟。
这里的主要问题是如何快速迭代行以找到我需要用于图形的相关行。
以简单的方式我可以遍历所有行并找到fromDate
到toDate
范围内的行。但如果我要处理几百万行,这对客户来说会很麻烦。
我使用google flat buffer传输数据,然后我自己构建行。所以我可以用其他任何格式保存它们。
希望这有助于了解我的需求。谢谢!
答案 0 :(得分:1)
使用您当前的存储方式,除了遍历整个阵列之外没有其他或更快的方法。所以你的复杂性只有O(n)
才能遍历数组。
您需要访问的信息存储在一个对象中,该对象本身存储在数组中。除了查看每个单个对象之外,您还能如何访问这些信息。即使在具有不同阵列实现的其他语言中,也不会有更快的方式。
提高速度的唯一方法是更改存储数据的方式。
例如,您可以使用日期作为索引来实现BST。由于这将按日期排序,因此您不必遍历整个树,并且您需要更少的操作来查找范围内的节点。我担心你必须自己建造它。
<强>更新强>
这与您的初始问题有关。您的更新将朝着一个全新的方向发展。
我认为你的方法不是一个好主意。您无法处理如此大量的数据,至少不能以高效的方式处理。为什么不根据客户端真正需要的内容更频繁地查询服务器。您甚至可以调整分辨率,因为您可能不需要所有点,具体取决于所选范围的大小。
尽管如此,如果我们可以假设您获得的数组已经按日期排序,您可以使用Binary Search Algorithm更快地找到匹配值。
这就是它基本上如何工作:你从数组的中间开始,如果找到的数字高于你要查找的数字,你检查数组的左半部分,如果它更低,你检查正确的那一个。现在你检查新部分的中间部分。您继续使用此模式,直到找到您的价值。
二元搜索算法的可视化,其中4是目标值。
二进制搜索算法的平均性能为O(log n)
,因此这肯定会有所帮助。
这只是一个给你一个想法的开始。您需要稍微修改一下,才能使用您的范围。