Clojure 分区特定集

Clojure 分区特定集,clojure,Clojure,我想使用clojure对特定集合进行分区: 例如: 有一个向量[1 2 3 4 5]。这里还有一个映射,如{21,31},这意味着生成一个包含2个元素的集合,以及一个包含3个元素的集合 (some_function {2 1, 3 1} [1 2 3 4 5]) ;; I only want to these: (([1 2 3] [4 5]) ([1 2 4] [3 5]) ([1 2 5] [3 4]) ([1 2] [3 4 5]) ([1 3 4] [2 5])

我想使用clojure对特定集合进行分区:

例如: 有一个向量
[1 2 3 4 5]
。这里还有一个映射,如
{21,31}
,这意味着生成一个包含2个元素的集合,以及一个包含3个元素的集合

(some_function {2 1, 3 1} [1 2 3 4 5])
;; I only want to these: 
 (([1 2 3] [4 5]) 
 ([1 2 4] [3 5]) 
 ([1 2 5] [3 4]) 
 ([1 2] [3 4 5]) 
 ([1 3 4] [2 5]) 
 ([1 3 5] [2 4]) 
 ([1 3] [2 4 5]) 
 ([1 4 5] [2 3]) 
 ([1 4] [2 3 5]) 
 ([1 5] [2 3 4]))

以前,我想使用生成所有案例,然后根据条件进行过滤,但如果有像
[1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17]
这样的大向量和像
{5 1,6 2}(生成一个包含5个元素的集合和两个包含6个元素的集合)
这样的映射,则效率非常低。我只想在第一时间生成我需要的内容,我如何才能完成这项工作?

在您给出的具体示例中,有5717712个分区满足这些约束,并且有更多的可能性没有约束。因此,并不是说组合学效率低下;我认为你只是低估了有多少可能性

“组合”功能是一个更好的工具,用于实现您正在寻找的更直接的组合

以你为例,

(def specific-partitions
  (let [initial-list [1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17]]   
    (for [c1 (combinations initial-list 5)
          :let [remainder1 (remove (set c1) initial-list)]
          c2 (combinations remainder1 6)
          :let [remainder2 (remove (set c2) remainder1)]]
      [c1 c2 remainder2])))

=>(take 10 specific-partitions)

([(1 2 3 4 5) (6 7 8 9 10 11) (12 13 14 15 16 17)] 
 [(1 2 3 4 5) (6 7 8 9 10 12) (11 13 14 15 16 17)] 
 [(1 2 3 4 5) (6 7 8 9 10 13) (11 12 14 15 16 17)] 
 [(1 2 3 4 5) (6 7 8 9 10 14) (11 12 13 15 16 17)] 
 [(1 2 3 4 5) (6 7 8 9 10 15) (11 12 13 14 16 17)]
 [(1 2 3 4 5) (6 7 8 9 10 16) (11 12 13 14 15 17)] 
 [(1 2 3 4 5) (6 7 8 9 10 17) (11 12 13 14 15 16)]
 [(1 2 3 4 5) (6 7 8 9 11 12) (10 13 14 15 16 17)]
 [(1 2 3 4 5) (6 7 8 9 11 13) (10 12 14 15 16 17)]
 [(1 2 3 4 5) (6 7 8 9 11 14) (10 12 13 15 16 17)])
仍然有相当多的分区,但至少您现在正在直接生成它们

从本例中,您可以将此技术推广到一个函数,该函数采用描述分区结构的任意映射,如您在问题中所述


如果初始集有重复的元素,我在这里编写的特定代码将无法正常工作;这将需要一种稍微不同的去除方法。

为什么组合数学效率低下?“(组合/组合[1 2 3]2)”可能对本案有所帮助。在使用组合之前,请确保对向量进行分区。实际上,有可能存在重复的元素,那么如何操作?谢谢什么样的复制品?在任何情况下,对结果调用“distinct”都应该有效。