これらの魔法のPythonのビット・コンピューティングは、あなたの目を離しません

ビットコンピューティング性能は皆、絶対に高効率に明らかにされている必要があります。私は、ソースコードを読むことを学習するプロセスに興味を持つ学生のソースはビット演算を使用してソースコードの多くを見つけると確信しています。しかし、なぜ実際のプログラミングの過程でそれのあまりを使うのか?おそらく最大の理由は、理解することがより困難です。しかし、インタビューの過程で、手書きコードの過程で1つまたは2つのビット・コンピューティングのためのコードを書くだけでなく、インタビュアーが輝いします。

ビット演算子は、一般的に含み、&(ビット単位と)、|(ビット単位または)〜(ビット単位)^(ビット単位の排他的論理和)、<<(シフト署名左)、>>(とシンボルの右シフト)。

これらの魔法のPythonのビット・コンピューティングは、あなたの目を離しません

 

以下は、私たちはいくつかの例であなたを刺激することを願って、アプリケーションを記述しています。

図1に示すように、それは、奇数または偶数決定されます

私たちは通常、奇数の判定、あるいは余りがゼロであるかどうかを確認するために、2で割っている方法を考えます。

次のようにPythonのコードは次のとおりです。

:DEF(x)はISODD 
(X%2 <> 0)場合はFalse他にTrueを返し

それを計算するビットを使用する方法?

我々は1で、&演算子を使用するだけ必要&、1ならば、数が奇数であり、0の場合は、数が偶数であり、次のようにPythonコードです。

デフ(x)はISODD:
(X&1)場合はFalse他にTrueを返し

2、2で割った値2を乗じた左1当量、右に相当します

インタビューの中で、通常遭遇する問題は、バイナリ検索コードを記述することです。

以下のようにバイナリコードになります。

binary_search DEF(リスト、アイテム):
「」「
:のparamリスト:順序付きリスト
:PARAM項目:の要素を見つけるには
リターンを:リスト内の項目のインデックス、リストにNoneを返されません場合は
」「」
ロー= 0
ハイ= LEN(リスト) - 1。
ながら、低<=高次の
中間点=(ハイ+低)// 2
IFリスト[中点] ==アイテム:
戻り中点
のelifリスト[中点] <アイテム:
低=中点+ 1
ELIFリスト[中点]>アイテム:
。ハイ=中点- 1つの
リターンなし

ステップに>> 1、インタビュアーは確かにあなたを印象づける=中間点(低+高)で最も小型のランドマークと最大の添字中間値、ビット演算子の使用を、取る必要があります。

図3に示すように、2つの値の交換

私はプログラミング言語が使用されている学ぶために最初からいるようだとして、我々は、非常に精通していると考えているコードの交換価値:

一時= Bの
B =
A =一時

しかし、どのようにこの機能を達成するためにビット・コンピューティングを使用するには?

^ = bは
B ^ =
A ^ = B

それが何であるかを、原則、確かに理解することが難しいですか?

最初の行、= A ^ Bは、容易に理解されます。

第二列、B = B ^ A = B ^ A ^ B、B ^ B = 0、従ってB = A ^ 0、即ち、B =ため、

最初のステップで再割り当てするので第三行は、A = A ^ Bは、従って、A = A ^ B ^ A = Bは、価値交換が完了する。

ここで、特性がXORまとめる:排他的または任意の数自体と結果は0であり; 0及び結果は、任意の数または独自の排他的です。

4、ユニークなデータのリストを探してください

データリスト(2N + 1の整数)は、数回の残数N 2が浮上している、一度だけ表示されます。この種のデータをどのように見つけますか?

このトピックを参照してください、私たちが最初に考えは確かにデータ1の出現数を見つけるために、リストを歩いた後、リストを作成、アルゴリズムを数え、全体データサイクルカウントされると信じています。

したがって、空間的複雑さはO(N)です。

そのスペースの複雑さを軽減する方法?

ただ話をXOR機能を見て注:; 0とXOR結果の任意の数は、自分のした任意の数と独自の排他的論理和の結果が0です。

だから、倍の数があったN排他的論理和の結果の2が0である場合、数1または排他的な結果の発生回数は、回数でなければなりません。すなわち:すべてのデータに対して排他的論理和演算を行うことにより、データのユニークなアプローチを見つけ、空間的複雑度はO(1)に低減されます。

図5に示すように、二進数1の数の計算値

私たちは簡単にこのアルゴリズムを実装することができ、土台が以前にされていると信じています。単純なビット操作によって、操作結果が1であるかどうかを確認するために行われ、右一つは、継続と判定されます。以下を達成するためのPythonコード:

DEF number1Bit(X):
カウント= 0
ながらX:
カウント=カウント+(X - 1)
X = X >> 1つの
リターンカウント

このような問題は0の連続した複数存在する場合、あなたは複数のシフト操作を行う必要があるということです。より連続的なゼロをスキップする簡単な方法はありませんか?

すなわち、(X-1)&計算により、です。よく、例示する例が理解されなくてもよいです

X 1110 0000 
1 1101 1111 - X
X - (X-1)1100 0000

このように、我々は最後のものが検出されたことを置きます。

以下を達成するためのPythonコード:

DEF number1Bitは、(X):
= 0カウント
:ながらX
+ 1カウント=カウント
X = X・(X-1)
戻りカウント

要約:

図1に示すように、一般的に用いられる動作シナリオは、1または0(例えば、奇数と偶数は、1の統計的数値を決定される)のビット値を得ることです。

図2は、右の特性を左:2で割った値2を乗じた左1当量、右に相当します。

図3は、排他的論理和特性:0その結果は任意の数または独自の排他的であり、任意の数と独自の排他的論理和の結果が0です。

我々が言っているか、メッセージハを残してください!Pythonのチュートリアルについての詳細は、定期的にすべての人のために更新されます!

おすすめ

転載: www.cnblogs.com/cherry-tang/p/11057849.html