我正在寻找Clojure数据结构,它的工作原理类似于关系表(如在关系数据库中)。
Map (偶数双向) id -> (val1,val2,val3,...)做不到这项工作。例如,如果我想查找val2 = "something“的所有行,则需要O(n)。
但是我想在O(log )中的一列中执行搜索!
发布于 2016-04-10 04:24:20
在数据库中搜索不带索引的列谓词的行是O(n),因为必须检查每一行是否与该谓词匹配。如果您的谓词使用的列有索引,则可以使用该索引查找特定值的所有行,方法是在索引中查找该值作为键,以获取所有匹配的行。然后它通常是log(n)操作(它取决于索引的内部实现,例如对于B-tree,它是log(n))。
我不知道Clojure数据结构的开箱即用实现具有它们通常具有的单一用途的特征(例如,map是用于按单个键查找的关联数据结构,而不是具有多个索引的数据库中的多个键)。你宁愿需要一个库来提供某种类型的内存数据库,例如(正如缩略图在他的评论中提到的) DataScript,或者甚至是带有JDBC接口的内存中的SQL (例如,H2SQL,HSQLDB或DerbyDB,使用它们的内存存储)。
我不确定您的特定需求,但您也可以使用Clojure的基本API自己实现一些功能。例如,您可以使用Clojure set作为您的“表”,并使用clojure.set
中的一些函数来增强它
你的桌子:
(def my-table #{{:id 1 :name "John" :age 30 :gender :male}
{:id 2 :name "Jane" :age 25 :gender :female}
{:id 3 :name "Joe" :age 40 :gender :male}})
并指定您的索引:
(def by-id (clojure.set/index my-table [:id]))
(def by-age (clojure.set/index my-table [:age]))
(def by-gender (clojure.set/index my-table [:gender]))
然后在查询/过滤表时使用索引:
(clojure.set/intersection
(by-age {:age 30})
(by-gender {:gender :male}))
;; => #{{:id 1, :name "John", :age 30, :gender :male}}
https://stackoverflow.com/questions/36508949
复制相似问题