
我想编写一个函数,将给定的处理程序应用于所有输入排列,而不返回整个排列。
(在 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
}测试用例(简单):
率先引入语言包机制,可在1小时内制作出任何语言版本,程序所有应用文字皆引自LANG目录下的语言包文件,独特的套图更换功能,三级物品分类,购物车帖心设计,在国内率先将购物车与商品显示页面完美结合,完善的商品管理,具备上架、下架缺货及特价商品设置功能多多,商城名、消费税、最低购物金额、货币符号、商城货币名称全部后台设定,多级用户考虑,管理员只需要设置用户级别、不同级别用户之返点系统自动判断用户应得返还
0
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 个级别)。
(又名,使空间复杂度为 o(1) 或 o(n),甚至我猜 o(n^2) 更好)。。
i 是基于级别 i-1 的,对吧?听起来您正在寻找Pandita 算法
这是一种按字典顺序迭代生成数组所有排列的简单方法。
但是,它要求您可以对数组的元素进行排序。如果不能(因为它们是泛型类型),那么您可以创建所有数组索引的辅助数组,并生成其排列。
以上就是在排列上应用处理程序,而不需要级别缓存?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号