问题内容
我想编写一个函数,将给定的处理程序应用于所有输入排列,而不返回整个排列。
代码
(在 go
中)
-
查找排列:
// apply given handler on each combination, and return count only, func findallpermutationapplyhandler[t any](ts []t, handler func([]t)) int { n := 0 comblist := [][]t{{}} // when empty input, has 1 empty combination, not 0 combination, for i := len(ts) - 1; i >= 0; i-- { islastlevel := false if i == 0 { islastlevel = true } // prefix := ts[0:i] mover := ts[i] // fmt.printf("\nprefix = %v, mover = %v:\n", prefix, mover) var comblist2 [][]t // combinations with an extra item added, for _, comb := range comblist { for j := 0; j <= len(comb); j++ { // insert mover at index j of comb, comb2 := append(append(append([]t{}, comb[0:j]...), mover), comb[j:]...) // new_empty + left + mover + right if islastlevel { n++ handler(comb2) } else { comblist2 = append(comblist2, comb2) } } } comblist = comblist2 } return n }
测试用例(简单):
func TestFindAllPermutationApplyHandler(t *testing.T) { assert.Equal(t, FindAllPermutationApplyHandler([]int{1, 2, 3}, func(comb []int) { fmt.Printf("\t%v\n", comb) }), 6) }
说明
- 上面的函数
findallpermutationapplyhandler()
可以查找排列,并将给定的处理程序应用于每个组合。 -
但是它需要缓存之前的
n-1
级别(同时最近的 2 个级别)。 - 我已经避免了最终级别的缓存,因为没有更多级别依赖于它。
问题
-
- 是否可以避免缓存最近2个级别?
(又名,使空间复杂度为
o(1)
或o(n)
,甚至我猜o(n^2)
更好)。。
- 是否可以避免缓存最近2个级别?
-
- 但这对我来说似乎不可能,因为级别
i
是基于级别i-1
的,对吧?
- 但这对我来说似乎不可能,因为级别
-
- 如果是的话,是否有更好的算法来降低空间复杂度?迭代是首选(而不是递归)。
正确答案
听起来您正在寻找Pandita 算法
这是一种按字典顺序迭代生成数组所有排列的简单方法。
但是,它要求您可以对数组的元素进行排序。如果不能(因为它们是泛型类型),那么您可以创建所有数组索引的辅助数组,并生成其排列。
以上就是在排列上应用处理程序,而不需要级别缓存?的详细内容,更多请关注编程网其它相关文章!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
软考中级精品资料免费领
- 历年真题答案解析
- 备考技巧名师总结
- 高频考点精准押题
- 资料下载
- 历年真题
193.9 KB下载数265
191.63 KB下载数245
143.91 KB下载数1148
183.71 KB下载数642
644.84 KB下载数2756
相关文章
发现更多好内容猜你喜欢
AI推送时光机在排列上应用处理程序,而不需要级别缓存?
后端开发2024-02-06
咦!没有更多了?去看看其它编程学习网 内容吧