Swift版全排列-Heap's Algorithm

Swift版全排列-Heap's Algorithm,第1张

概述Swift 全排列算法,递归版和非递归版,都有! 参考于Wiki-Heap's algorithm 很有Swift特色,不是简单的翻译而已,废话不多说,直接上代码(Swift3+): import Foundation/// 递归全排列func heapsAlgorithmPermutationRecursive<T: Collection>(list: T) -> [[T.Iterator

Swift 全排列算法,递归版和非递归版,都有! 参考于Wiki-Heap's algorithm

很有Swift特色,不是简单的翻译而已,废话不多说,直接上代码(Swift3+):

import Foundation/// 递归全排列func heapsAlgorithmPermutationRecursive<T: Collection>(List: T) -> [[T.Iterator.Element]] {    var result: [[T.Iterator.Element]] = []    var temp = Array(List)    // Heap's Algorithm recursive    func heap(n: Int) {        if n == 1 {            result.append(temp)        }else {            for i in 0..<n-1 {                heap(n: n-1)                swap(&temp[n%2 == 0 ? i : 0],&temp[n-1])            }            heap(n: n-1)        }    }    // start    heap(n: temp.count)    return result}/// 非递归全排列func heapsAlgorithmPermutationNonRecursive<T: Collection>(List: T) -> [[T.Iterator.Element]] {    var result: [[T.Iterator.Element]] = []    var temp = Array(List)    var index = [Int](repeating: 0,count: temp.count)    var i = 0    // Heap's Algorithm non-recursive    result.append(temp)    while i < temp.count {        if index[i] < i {            swap(&temp[i%2 == 0 ? 0 : index[i]],&temp[i])            result.append(temp)            index[i] += 1            i = 0        }else {            index[i] = 0            i += 1        }    }    return result}// 测试数据//let List = Array(1...7)var List = "abc".charactersvar date = NSDate()var result: [[Any]]// 递归result = heapsAlgorithmPermutationRecursive(List: List)print("递归:\ncount:\(result.count)\n耗时:\(date.timeIntervalSinceNow)")print(result)// 非递归date = NSDate()result = heapsAlgorithmPermutationNonRecursive(List: List)print(date.timeIntervalSinceNow)print("非递归:\ncount:\(result.count)\n耗时:\(date.timeIntervalSinceNow)")print(result)// 去重测试List = "abb".charactersresult = heapsAlgorithmPermutationNonRecursive(List: List)print("未去重前结果:\n\(result)")let combine = result.flatMap { (c) -> String in    let r = c as! [Character]    return r.reduce("") {a,b in        a + String(b)    }}let norepeat = Set(combine)print("去重后:\n\(norepeat)")
总结

以上是内存溢出为你收集整理的Swift版全排列-Heap's Algorithm全部内容,希望文章能够帮你解决Swift版全排列-Heap's Algorithm所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1069476.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-26
下一篇2022-05-26

发表评论

登录后才能评论

评论列表(0条)

    保存