ホームページ >バックエンド開発 >PHPチュートリアル >PHP_PHP チュートリアルでの BigMap インスタンスの使用

PHP_PHP チュートリアルでの BigMap インスタンスの使用

WBOY
WBOYオリジナル
2016-07-13 09:58:56922ブラウズ

PHP での BigMap インスタンスの使用

この記事では主に PHP での BigMap インスタンスの使用方法を紹介します。コードには詳細なコメントが含まれています。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

//いわゆるビットマップは、ビットを使用して要素に対応する値をマークし、キーは要素です。データはBit単位で保存されるため、保存容量を大幅に節約できます。

/*

N =1 の場合、メモリ空間を int a[2];

として適用します。

並べ替えまたは検索する必要があるものの総数が N=10000000 であると仮定すると、適用する必要があるメモリ領域のサイズは int a[1 + N/32] です。ここで、a[0] は占有します。メモリ内の 32 は、10 進数 0 ~ 31 などに対応します:

1. 配列 a: n/32 の 10 進数の 0 ~ N に対応する添え字を見つけます。

2. 0 ~ 31 に対応する 0 ~ N の数字を見つけます: N%32=M

3. シフト 0 ~ 31 を使用して、対応する 32 ビット ビット 1: 1<

例:

3個保存したい場合

(1) 添え字 30/ 32 = 0; を a[0] に入れます。

(2) 3% 32 = 30;

(3) 左シフト 30 ビット 01000000 00000000 00000000 00000000 この対応する値 $a[0] = 1073741824;

1. 配列 a で 10 進数の 0 ~ N に対応する添え字を見つけます。

a[0] に対応する 10 進数 0 ~ 31 は、まず 10 進数 n を 32 の余りに変換します。これは、配列 a に対応する添字に変換できます。たとえば、n=24、n/32=0 の場合、配列 a の 24 に対応する添え字は 0 になります。たとえば、n=60、n/32=1 の場合、配列 a の 60 の添字は 1 になります。同様に、配列 a の 0 ~ N の添字を計算できます。

2. 0 ~ 31 に対応する 0 ~ N の数字を見つけます。

10 進数の 0 ~ 31 は 0 ~ 31 に対応し、32 ~ 63 も 0 ~ 31 に対応します。つまり、数値 n が与えられると、0 ~ 31 に対応する数値は 32 を法として求めることができます。

3. シフト 0 ~ 31 を使用して、対応する 32 ビットのビット 1 を作成します。

0 ~ 31 に対応する数値を M として見つけ、M ビットだけ左にシフトします。つまり、2^M に設定します。

これから、10,000,000 ビットが占めるスペースを計算します。

1バイト = 8ビット

1kb = 1024バイト

1mb = 1024kb

占有スペースは: 10000000/8/1024/1024mbです。

おそらく 1mb を少し超える程度です。

*/

クラスビッグマップ{

//保存するには 2 バイトを使用してください

プライベート $マスク = 0x1f ;

プライベート $bitsperword = 32;

//シフトするビット数は 5 pow(2,5) = 32 です

プライベート $shift = 5 ;

//データを保存する配列

パブリック $bitArray = array();

/**

$i に対応する数値はゼロにリセットされます

*/

関数クリアビット($i){

////すると、現在のバイトの指定されたビットは0に設定され、相手の配列の他のビットは&以降変更されません。これが1の素晴らしい使い方です

// $i>>ここでの SHIFT は intval($i /32) と同等です ;

// ここでの $i & $this->mask は $i % $this->mask と同等であり、剰余を取ります

@$this->bitArray[$i >> $this->shift] &= ~(1<<($i & $this->mask));

}

/**

$i に対応する数値は 1 に等しいです

*/

関数 setbit($i){

@$this->bitArray[$i >> $this->shift] |= (1<<($i & $this->mask));

}

//test ビットが 1 かどうかをテストします

関数テストビット($i){

return $this->bitArray[$i >> $this->shift] & (1<<($i & $this->mask));

}

}

$oBig = 新しい bigMap() ;

$oBig->setbit(30) ;

var_dump($oBig->testbit(2)) ;

var_dump($oBig->bitArray) ;

http://www.bkjia.com/PHPjc/976538.htmlwww.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/976538.html技術記事 PHP での BigMap インスタンスの使用 この記事では主に PHP での BigMap インスタンスの使用方法を紹介します。コードには詳細なコメントが含まれています。 1 2 3 4 5 6...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。