tem*_*def 14 algorithm math statistics percentile data-structures
假设您有大量的键/值对,其中值是一些任意实数.您有兴趣创建支持以下操作的数据结构:
例如,该数据结构可以用于在接收全国范围的测试分数流时有效地确定给定学生的百分位数,或者识别具有异常好的或差的服务质量的医院.
有没有办法让这些操作有效运行(比如,次线性时间?)
tem*_*def 13
实现此数据结构的一种可能方式是使用订单统计树和哈希表的混合.
订单统计树是一种平衡二叉搜索树,除了正常的二叉搜索树操作外,还支持另外两个操作:
可以通过增加正常平衡二叉搜索树(例如,红/黑树或AVL树)以及在旋转期间保留的额外信息来构建顺序统计树.通过这种方式,可以使订单统计树上的所有正常BST操作在O(log n)时间内运行,额外操作也在O(log n)时间内运行.
现在,让我们假设您纯粹存储值分数,而不是键/百分位数.在这种情况下,如下实现百分位查找将非常简单.将所有值存储在订单统计树中.要确定给定值的百分位数分数,请使用订单统计树上的排名操作来查找该值显示的索引.这给出了一个数字,范围从0到n - 1(其中n是树中元素的数量),表示该分数在订单统计树中的位置.然后,您可以将该数字乘以99 /(n - 1),以获得根据需要在0到99范围内运行的值的百分位数分数.
要确定大于某个百分位数的最低值,可以使用select操作,如下所示.给定0到99之间的百分位数,多个百分位数99 /(n - 1)得到0和n - 1之间的实数,包括0和n - 1.取该数字的上限会产生0到n - 1(包括0和n - 1)范围内的自然数.使用订单统计树上的选择操作,然后可以用于查找处于或高于给定百分位数的范围中的第一个值.
但是,这些操作假设我们在数据结构中具有纯值,而不是键/值对.为了使此操作适用于键/值对,我们将按如下方式扩充数据结构:
这两项更改使我们可以为数据结构实现所需的功能.为了使数据结构按密钥进行百分位查找,我们首先使用给定的密钥查询哈希表以查找其关联值.然后,我们对值进行百分位查找,如前所述.为了使数据结构告诉我们一个值为第一个等于或高于给定百分位数的密钥,我们在订单统计树上执行正常的查找百分位操作,如上所述,然后查找与给定值相关联的密钥.
如果我们假设哈希表使用链式散列,那么每个操作所需的时间如下:
希望这可以帮助!