首页 > 后端开发 > Golang > 正文

在排列上应用处理程序,而不需要级别缓存?

WBOY
发布: 2024-02-06 09:42:08
转载
829人浏览过

在排列上应用处理程序,而不需要级别缓存?

问题内容

我想编写一个函数,将给定的处理程序应用于所有输入排列,而不返回整个排列。

代码

(在 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 个级别)
  • 我已经避免了最终级别的缓存,因为没有更多级别依赖于它。

问题

    1. 是否可以避免缓存最近2个级别?

      (又名,使空间复杂度为 o(1)o(n),甚至我猜 o(n^2) 更好)。

    1. 但这对我来说似乎不可能,因为级别 i 是基于级别 i-1 的,对吧?
    1. 如果是的话,是否有更好的算法来降低空间复杂度?迭代是首选(而不是递归)。

正确答案


听起来您正在寻找Pandita 算法

这是一种按字典顺序迭代生成数组所有排列的简单方法。

但是,它要求您可以对数组的元素进行排序。如果不能(因为它们是泛型类型),那么您可以创建所有数组索引的辅助数组,并生成其排列。

以上就是在排列上应用处理程序,而不需要级别缓存?的详细内容,更多请关注php中文网其它相关文章!

相关标签:
最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:stackoverflow网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号