#iterator #zip #traversal #traverse #no-alloc #breadth-first

no-std breadth-first-zip

保证索引和单调递增的广度优先zip

3个版本 (破坏性更新)

0.3.0 2023年7月2日
0.2.2 2023年7月1日
0.1.0 2023年6月29日

#1383算法


2 个crate中使用 (通过 derive-quickcheck)

MPL-2.0 许可证

20KB
374

广度优先zip

属性测试和验证,确保在严格递增的索引和中返回每个可能值恰好一次。

为什么?

因为当你有多个迭代器,并希望从最小到最大的整体值覆盖每个可能的值时。

例如,对于三个实例的 0..3,你会得到这个

0 0 0 # sum = 0
0 0 1 # sum = 1
0 1 0
1 0 0
0 0 2 # sum = 2
0 1 1
0 2 0
1 0 1
1 1 0
2 0 0
0 1 2 # sum = 3
0 2 1
1 0 2
1 1 1
1 2 0
2 0 1
2 1 0
0 2 2 # sum = 4
1 1 2
1 2 1
2 0 2
2 1 1
2 2 0
1 2 2 # sum = 5
2 1 2
2 2 1
2 2 2 # sum = 6

输入可以是任何非空迭代器,甚至可以结合不同的大小。


lib.rs:

为可重复迭代器提供广度优先穷举zip。行为符合以下伪代码规范

  • 将计数器 i 初始化为零。
  • 当被提示时,从每个迭代器中拉取第一个元素。
    • 如果任何迭代器为空,则返回 None
  • 当再次被提示时,仅前进最后一个迭代器。
  • 继续这样做,直到最后一个迭代器终止或达到其 i 次元素。
    • 当这样做时,将其重置并从第二个到最后一个迭代器中拉取下一个元素。
  • 重复此过程,直到耗尽第一个迭代器。
    • 当你这样做时,增加 i 并重复。
  • 一旦 i 超过最长迭代器的长度,我们就可以结束:返回 None

依赖项

~295–740KB
~18K SLoC