2016-12-31 4 views
1

私が取り組んでいる大規模なプロジェクトの一部として、このコードサンプルをSwift Playgroundsにコンセプトの概念として組み込みました。私がする必要があるのは、一連のオプション(optionsArrayまたはtestArrayで表される)を渡すことです。ここで、各intは利用可能なオプションの数です。これらのオプションは、最終的に3億以上の別々のPDFとHTMLファイルに組み込まれます。コードは現在動作しており、私が望む可能性の巨大なリストを出しています。再帰の方が良いでしょうか?

私の質問は次のとおりです。このような状況を処理するためのより良いアプローチはありますか?よりエレガントで効率的なものがありますか?これはではないアプリや何かにライブで実行されるものは、コマンドラインから実行し、必要な時間をすべて取るだろうが、パフォーマンスや安定性のためのより良いアプローチがあれば、私はすべての耳です。

私が知っていること:配列から0の値を処理することはできません。配列は定数なので、偶然には発生しません。コードが行を処理する方法は物事を扱いますが、0は無意味な値です。各要素は使用可能なオプションの数を表します。したがって、2は基本的にブール値です.1はfalseのみです。したがって、将来の拡張のためにプレースホルダ要素が必要だった場合、値は1になり、出力には0として表示されます。

最終製品は、出力としてコンソールにテキストをバーフルで表示するだけでなく、アレイに基づいてpermutationEnding()機能でファイルを書き込みます。

let optionsArray: [Int] = [7,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,2,2,2,2,2,2,2,2] 
let testArray: [Int] = [7,2,3,2] 
var currentOptions: [Int] = [] 
var outputString: String = "" 
func buildPermutations(array: Array<Int>) { 
    currentOptions.removeAll() 
    permutationRecursion(array: array, index: 0) 
} 
func permutationRecursion(array: Array<Int>, index: Int) { 
    for i in 1 ... array[index] { 
     currentOptions.append(Int(i-1)) 
     if array.count > (index + 1) { 
      permutationRecursion(array: array, index: index + 1) 
     } else { 
      permutationEnding() 
     } 
     currentOptions.removeLast() 
    } 
} 
func permutationEnding() { 
    for i in 1 ... currentOptions.count { // Output Elements 
     outputString += String(currentOptions[i-1]) 
    } 
    outputString += "\n" // Goes after output elements closing bracket. 
} 
// buildPermutations(array: optionsArray) 
buildPermutations(array: testArray) 
print(outputString) 

考えられますか?

+0

あなたは何をしようとしていますか?いくつかの定義済みオプションを使用して順列のリストを作成しますか? –

+0

本質的に、はい。私は、人々がインタビュープロセスを通過できるようにするエンタープライズアプリケーションを持っており、回答の一部は、より多くの情報をトリガして、動的に生成されるPDFに入れられるようにします。私が働くビジネスの性質上、サーバー上でカスタムコード(PHPなど)を実行する監査リスクは圧迫され、JavaScriptを使用するクライアント側のPDF生成オプションは最適ではありません。私は、アプリケーションに似たWebバージョンでもどちらも使用しない解決策を見つけるように頼まれました。 –

+0

それで、私はHTMLテンプレートを(私が既存のアプリケーションと同じように)このようなものに送り出し、プレマイドPDFとしてすべての可能性を出す必要があります。最終的には、デシジョンツリー全体をHTMLとして構築しなければならないため、アプリケーションのように機能します。 Theeの出力は50101010011 ... etc.pdfのようになります。ばかばかしいことですが、サーバーサイドの技術を使わずにあらゆるオプションを用意することができます。規制当局は人生を変なものにすることができます。 –

答えて

0

私はあなたが何をしようとしているのか分かったと思います。デシジョンツリー上のすべての可能なルートをマップできる可能なすべての整数の組み合わせの文字列出力が必要です。

私は4行か5行にしました。

let n = testArray.count // for readability 
let products = ([Int](1...n)).map({testArray[$0..<n].reduce(1, *)}) 

// products is the cross product of element i + 1 to element n of the array for all i in the array 

let zipped = zip(testArray, products) 

for i in 0..<testArray.reduce(1, *) { // this reduce is the cross product of the whole array 

    let treePath = zipped.map(){ String(i/$0.1 % $0.0) }.joined() 
    outputString += treePath + "\n" 
} 

もう1つ編集:これは、NumPyのようないくつかの空想的な行列演算によって高速になると思います。 Accelerateフレームワークがあなたのためにいくつかの魔法を遂行できるかどうかは疑問ですが、私はそれに取り組んでいません。

編集:私は興味があったので、私は問題の再帰関数だった。このテストアレイ

let testArray: [Int] = [7,2,2,2,2,2,2,3,2] 

でそれをタイミング:132.56秒

ここジップマップだった:14.44秒

そして、テスト配列に要素を追加すると指数関数的に見えます。

+0

それは美しさです!それがどのように仕事をしているのかを正確に理解するために少しの宿題をしなければならないでしょう。私はNumPyも見て、私がそこで見つけることができるものを見ます。問題にアプローチする方法についての洞察と異なる考えに感謝します。 –

+0

NumPyはMatrix/Series全体を非常に迅速に操作できるPythonライブラリです。私はAccelerateフレームワークがObjC/Swiftで同様のことをすることができることを読んだ。好奇心のために、これは臨床練習ガイドライン/病歴摘要をコンピュータ化するためのものですか? –

+0

そうではありません。これは、高度にカスタマイズ可能なアカウントと金融機関の付随サービス向けです。インタビュープロセスと結果として得られる回答(配列)は、基本的に、アカウントアプリケーションの要件とそれに関連する推奨製品/サービスのロードマップを形成します。 –