如何根据关键和时间间隔有效地查找父记录?

Posted

技术标签:

【中文标题】如何根据关键和时间间隔有效地查找父记录?【英文标题】:How to find parent records efficiently based on both key and time intervals? 【发布时间】:2021-12-20 13:54:57 【问题描述】:

定义

父记录具有“P”类型、祖先键、日期间隔。

其子记录的类型为“C”,具有相同的祖先键,并且其日期间隔匹配或落在其父间隔内。

所有记录都是唯一的 父记录可以共享同一个祖先键,但它们的日期间隔不能重叠 父记录可以有多个子记录

示例

父记录可以是:

P, 12345, (1000-01-01, 1000-12-31) P, 12345, (1001-01-01, 1001-12-31) // 没有重叠的日期,有效

第一个父记录的有效子记录可以是

C, 12345, (1000-01-01, 1000-12-31) // 匹配所有内容,有效 C, 12345, (1000-05-05, 1000-09-09) // 匹配祖先键,在父母的日期间隔内,有效

问题

给定一组包含父母和孩子的随机记录,我如何根据关键和时间间隔有效地将集合分为一个唯一父母及其有效孩子的不同组?

保证每个孩子只有一个父母。但也有可能父母没有孩子。

蛮力解决方案

以线性时间识别所有父记录。然后遍历它们并在平方时间内成对匹配所有其他记录。

问题

有更快的方法吗?

【问题讨论】:

您是在使用数据库还是需要通过编程对这些进行排序? 我需要通过内存中的编程对这些进行排序。记录集是完全不可预测的。 【参考方案1】:

最简单的方法是制作一个P记录列表和一个C记录列表,然后将它们都按(ancestor_key, interval.start)排序

然后您遍历父母列表,并为每个父母从子列表中提取其孩子。由于排序的原因,父子列表的顺序是相对应的,所以两个列表中感兴趣的位置只会向前移动。

总复杂度为 O(n log n),主要是排序。

【讨论】:

由于子节点的间隔可以比其父节点的间隔开始和结束得更早(只要它在其父节点的间隔内),因此这种排序不能保证父子对是按顺序排列的。 是的,确实如此:P(x,10-20), P(x,25,50) 和 C(x,12,13)​​, C(x,14,15), C (x,26,29),例如 抱歉,我的立场已得到纠正。现在我明白你的想法是如何运作的了。谢谢!

以上是关于如何根据关键和时间间隔有效地查找父记录?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 PHP 和 MySQL 有效地对大型数据集进行分页?

如何高效地使用 SQL 检索半小时间隔的数据?

第七章学习小结

大话数据结构之查找

大话数据结构之查找

在使用WORD时,需要制作一个关键词和页码的索引页面。请问如何根据关键词速查出其所在的页码?