【问题标题】:Bitwise operators for filtering?用于过滤的位运算符?
【发布时间】:2013-10-31 20:48:00
【问题描述】:

我正在努力为一个相当典型的调度应用程序找到一个好的数据表示。有点搞砸的要求是,每天都有两方,每方都有任意可用性,并且有或多或少在固定时间提供的课程(尽管这里也可能发生例外),而与是否有两方无关在那个时间是否可用。

由于稍后的挑战之一是为已安排的课程找到可用的提供者,我想知道是否有一种快速而优雅的方法是简单地将这些每周可用性模式存储在一个 64 位整数中,并带有一种位掩码。

我的理由是,基本上,每天有 24 小时(

过滤和识别潜在用户可以非常快速和简单地完成,只需将任何潜在约会转换为相同类型的掩码,然后只需执行按位运算即可仅选择可用的候选人,而无需担心进一步的规则等。

我想知道的原因是为什么我没有看到在位级别上发生更多过滤,因为它似乎相当简单,我猜希望实际上最终会比更冗长和明确的逻辑,有什么想法/想法吗?

【问题讨论】:

  • 嗯,144 个插槽不是 144 位掩码,1 位表示每个插槽是否可用?在一个 8 位数字中,您只能说,用户在第 100 个插槽中可用 10 分钟。您可以使用 8 位掩码,其中每个位都是“正常”8 小时工作日中的可用小时。但不是在 144 个插槽中。但如果我错了,请纠正我。
  • 好点,我觉得错过它很愚蠢;-) 实际上,在这种情况下,即使是 8 位掩码也可能就足够了。总的来说,我对使用这种掩码进行快速过滤非常感兴趣,而且我还没有真正看到在我见过的任何 Web 项目中这样做,所以我想知道原因是什么(或者如果我只是在看错误的项目...)所以最初的问题仍然与我高度相关...

标签: python django database-design architecture bit-manipulation


【解决方案1】:

premature optimization 的典型情况。先让你的程序运行起来,只有当它很慢时,你才应该开始考虑使用按位运算来优化它。您应该真正开始以尽可能最简洁的方式实现它,例如使用一个向量或布尔值列表,它们不限于 64 的任意长度。

例如,您可以使用 numpy 数组和 dtype=bool。这可能比手动编码的位向量稍微不紧凑,但是您可以免费获得所有logical operations(您也可以使用|, ^, & and ~ 之类的运算符),而且您可以拥有几乎无限的大小,允许切片,索引等。

【讨论】:

  • 一方面直觉上我会同意 - 但另一方面,这实际上是基于简单的优雅而出现在我的脑海中的。如果您只使用一长串布尔值或向量,我不确定您如何能够简单地确保所有边缘情况在周期中间被中断等 - 所有这一切都将在按位操作中进行照顾“免费” - 您只需创建一个简单的库,它需要开始和结束时间和日期,并转换为您逐位比较的按位模式。
  • @Jonas 什么边缘情况?我看不到任何可以用 64 位整数解决的情况,而用布尔值列表/数组则无法解决。当标准 python 或非常常见的外部库(如 numpy)中已经提供所有功能时,为什么还要浪费时间编写自己的库。这正是过早的优化:您可能会通过使用快速的按位运算节省几秒钟,但与此同时,如果您完成了,您已经花了一周的时间来实现和调试您的库。当然,除非你这样做是为了好玩,否则你可以为所欲为……
  • @BasSwinckels 我可能没有正确理解您的解决方案。所以你的意思是本质上而不是使用例如11001111 作为 8 位整数我采用 8 个元素的 bool 数组?如果我有一个约会是 00000111(即前三个时间段),那么我只需为此创建另一个 bool 数组并使用logical_and 来查看该时间表是否在那里可用?听起来它可以工作。
  • 然而,现在在数据库中保存这个时间表信息还有一个额外的问题(项目是基于网络的,使用 Django)——我当然可以使用 cPickle 之类的东西,但是每次都必须反序列化所有条目考虑到可能至少会有几千个这样的可用性计划,而且这是一个非常频繁的操作,或者我错过了什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-02
  • 2012-04-23
  • 1970-01-01
  • 2020-06-02
  • 2011-01-11
相关资源
最近更新 更多