1

番号のリストが正しい順序であるかどうかを識別する必要があります。具体的には5のシーケンス。

例1:

  • (オリジナルシリーズ) 1,3,4,67,43,20
  • (注文シリーズ) 1,3,4,20,43,67
  • それは5のシーケンスですか? FALSE

例2

  • (オリジナルシリーズ) 147,10,143,432,144,23,145,146
  • (注文シリーズ) 10,23,143,144,145,146,147,432
  • それは5のシーケンスですか? TRUE (すなわち143-147)

現在-順序付きリストをループし、現在の番号が最後の番号+1と等しいかどうかを確認し、カウンターを保持します。これは機能しますが、これを数学的に、またはプログラムで行うためのより良い方法があるかどうか興味があります。

<cfscript>
_list1 = [1,3,4,67,43,20]; // should evaluate to FALSE
_list2 = [147,10,143,432,144,23,145,146]; // should evaluate to TRUE

_list = _list2; // switch list in one place - test purposes only.
_seq = 1; // sequence counter
_cap = ''; // value of the upper most number of the sequence
_msg = 'There is not a consecutive sequence of 5.'; // message to user

// sort the array smallest to largest 
arraySort( _list, 'numeric' ); 

// loop the array - compare the last number with the current number 
for ( i=2; i LTE arrayLen( _list ); i++ ) {
    _last = _list[i-1]; // the LAST number - we started at the second element, so we shouldn't error.
    _this = _list[i]; // this current number
    // compare the two numbers
    if ( val( _this ) EQ val( _last ) + 1 ) {
        _seq = _seq + 1; // increment our sequence
        _cap = _this; // set the top number
    }
}

// re-set the message if we meet some threshold (5) is hardcoded here 
if ( val( _seq ) GTE 5 ) {
    _msg = 'Sequence of ' & _seq & ' to ' & _cap;
}

// write the message 
writeoutput( _msg );    
</cfscript>
4

4 に答える 4

2

パフォーマンスのために、最初に少なくとも 5 つの要素があることを確認する IF ステートメントでループをラップします。4 つの要素をループしても意味がありません。

そして、「seq」= 5 の場合はループ内でチェックを行い、すぐにループから抜け出します (シーケンスの長さが 5 より大きいかどうかを実際に調べる必要がない限り)。

あなたが試すことを検討するかもしれないもう一つのこと。ループの前に、リストの最初の要素とリストの最後の要素を比較できます。それらの差が 5 未満の場合、ループを実行しても意味がありません。あなたのデータからは、これは起こりそうにないように見えますが。

于 2012-10-11T08:20:59.223 に答える
1

あなたがもっと知りたいのは、アルゴリズムの時間の複雑さです ( https://en.wikipedia.org/wiki/Time_complexity )。

現在のアルゴリズムは、最初に並べ替えを行い、次にすべての要素を反復処理します。アルゴリズムの時間計算量を決定するには、まず Coldfusion の並べ替えアルゴリズムの時間計算量を知る必要があります。Coldfusion は Java に委譲し、Java 配列は QuickSortアルゴリズムを使用するため、アルゴリズムのソート部分に時間がかかることがわかっていますn*log(n)。配列を反復処理するアルゴリズムの 2 番目の部分にはn時間がかかります。これら 2 つの時間計算量を合計すると、 が得られn+(n*log(n))ます。

アルゴリズムの時間の複雑さを分析するとき、最も遅い部分のみに関心があります: n*log(n). したがって、Big O の時間計算量はO(n*log(n))です。

これは何を意味するのでしょうか?ソリューションのソート部分は最悪の部分です。並べ替えを行わずに問題を解決できれば、アプリケーションの速度が向上します。ただし、新しいソリューションが並べ替えよりも時間がかかることは何もないと仮定します。

于 2012-10-11T17:48:28.537 に答える
0

シーケンスから配列を作成し、配列を比較します。ここに良い例があります:リンク

于 2012-10-10T19:41:49.863 に答える
0

1,3,4,5,7ハイフンでつながれた (つまりのように)順番に 2 を超える内部系列を持つ一連の数値を出力する関数が必要であり、1,3-5,7他のどこにもすぐに見つからなかったので、この回答をここに置きます。あなたのコードは私のものよりも長くないように見えるので、私のものはあなたに有利ではないかもしれませんが、アクティブが最長のシーケンスを与えるという点であなたの質問に答えているようなものですcfreturn(5 のフロアと比較することができます)。cfreturn内部シーケンスの):

<cffunction name="fNumSeries" output="1" hint="pass in sorted array, get count of longest sequence">
<cfargument name="raNums" required="1" type="array">
<cfset numHold=raNums[1]>
<cfset isSeq="">
<cfset hasSeq=0>
<cfsavecontent variable="numSeries">
<cfloop from="1" to="#arraylen(raNums)#" index="idxItem">
    <cfif idxItem eq 1>#raNums[1]#<!--- always output the first --->
    <cfelse>
        <!--- if in a sequence and not the last array element, no output --->
        <cfif numHold+1 eq raNums[idxItem] and idxItem neq arraylen(raNums)>
            <!--- capture the first value of the sequence --->
            <cfif len(isSeq) eq 0><cfset isSeq=numHold></cfif>
        <cfelseif len(isSeq)><!--- was in sequence but no longer --->
            <!--- if more than 2 in a row, show as sequence (n-n) --->
            <cfif idxItem eq arraylen(raNums) and raNums[idxItem] gt isSeq+1>
                - #raNums[idxItem]#
                <cfif hasSeq lt numHold - isSeq+1><cfset hasSeq=numHold - isSeq+1></cfif>
            <cfelseif raNums[idxItem] gt isSeq+3>
                - #numHold#, #raNums[idxItem]#
                <cfif hasSeq lt numHold - isSeq+1><cfset hasSeq=numHold - isSeq+1></cfif>
            <!--- otherwise show the 2nd (held) sequential value and current array value --->
            <cfelse>, #isSeq+1#, #raNums[idxItem]#
            </cfif>
            <cfset isSeq="">
        <cfelse>, #raNums[idxItem]#<!--- not in sequence --->
        </cfif>
    </cfif>
    <cfset numHold=raNums[idxItem]>
</cfloop>
</cfsavecontent>
<!--- <cfreturn replace(numSeries, " ,", ",", "all")> --->
<cfreturn hasSeq>
</cffunction>
于 2014-12-03T19:14:03.477 に答える