私はhttp://comicjk.com/comic.php/906を読んでいました。そこでは、あるリストが別のリストの順列であるかどうかをチェックする問題が提示され、2つの解決策が提案されています。
「cbrain」ソリューション「リストには常に4つ少ない数が含まれ、各数は256未満になるため、すべての順列を32ビットintにバイトパックできます...」
「pythonbrain」ソリューションは、両方を並べ替えてから比較することです。これはより明白に思えますが、より効率的な(そして低レベルの)ソリューションに興味があります。
私の最初のアプローチは次のとおりです。
int permutations(int a[4], int b[4]){
int A = a[0] | a[1]*1<<8 | a[2]*1<<16 | a[3]*1<<24;
int B = b[0] | b[1]*1<<8 | b[2]*1<<16 | b[3]*1<<24;
unsigned int c=0, i=0;
for( i=0xFF; i>0; i<<=8 ){
if(
A&i == B&0xFF ||
A&i == B&0xFF00 ||
A&i == B&0xFF0000 ||
A&i == B&0xFF000000
) c |= i;
}
if( c == 0xFFFFFFFF )
return 1;
return 0;
}
しかし、A&iとB * 0xxxxxxxxxの両方を同じバイトに配置する簡単な方法を見つけられない限り、これは機能しません(私たちが見ているバイトの後の末尾の0を削除します)。だから何かのような
(a&i>>al)>>ar == b(&j>>bl)>>br
ここで、al + ar == bl + br == 4であり、調べているバイトを判別するために使用されます。
別のアプローチ
コメントボックスの誰かが「Cでは、適切なサイズのメモリのセクションを動的に割り当てて、それを単一の数値として扱ってみませんか?確かに、intを使用するよりも少し遅くなりますが、制限もありません。 4つ以下の要素または最大数の256を含み、それでもソートよりも高速です(CまたはPythonのどちらでも)...」
ビット単位の長さが最大数よりも大きい配列を作成できる場合は、適切なビットを設定して配列を比較できますが、これを1つの大きな数として効率的に処理できない限り、比較を行うため、より多くの比較が可能になります。 cで。
x86(私は学習を始めたばかりです)にはSBC命令があるので、各部分を減算でき、結果がすべてゼロの場合(JNE / JNZでテストできます)、それらは等しくなります。
私が知る限り、私たちはまだやらなければならないでしょう/SBCとジャンプ
実際の質問
方法を知りたい
- バイトパッキング
- リスト全体を1つの大きな数として扱う
リストが別のリストの順列であるかどうかを確認するために使用できます(リストが4項目以下で、各項目が256未満であると想定)