1
- var fs = require ( 'fs' ) ;
1
+ const fs = require ( "fs" ) ;
2
2
function Bm ( parent , child ) {
3
- let baseP = 0 ;
3
+ let baseP = 0 ;
4
4
5
- while ( true ) {
6
- let badC = '' ;
7
- let goodS = '' ;
8
- let flag = 0 ;
9
- for ( let i = child . length - 1 ; i >= 0 ; i -- ) {
10
- if ( child [ i ] == parent [ baseP + i ] ) {
11
- flag ++ ;
12
- if ( flag == child . length ) {
13
- return baseP ;
14
- }
15
- } else {
16
- badC = parent [ baseP + i ] ;
17
- goodS = child . substring ( i + 1 ) ;
5
+ while ( true ) {
6
+ let badC = "" ;
7
+ let goodS = "" ;
8
+ let flag = 0 ;
9
+ for ( let i = child . length - 1 ; i >= 0 ; i -- ) {
10
+ if ( child [ i ] == parent [ baseP + i ] ) {
11
+ flag ++ ;
12
+ if ( flag == child . length ) {
13
+ return baseP ;
14
+ }
15
+ } else {
16
+ badC = parent [ baseP + i ] ;
17
+ goodS = child . substring ( i + 1 ) ;
18
18
19
- //选择坏字符规则和好后缀规则计算出的较长的后移位数
20
- let b = bad ( badC , child , i ) ;
21
- let g = good ( goodS , child )
22
- if ( b > g ) {
23
- baseP += b ;
24
- } else {
25
- baseP += g ;
26
- }
27
- break ;
28
- }
19
+ // 选择坏字符规则和好后缀规则计算出的较长的后移位数
20
+ const b = bad ( badC , child , i ) ;
21
+ const g = good ( goodS , child ) ;
22
+ if ( b > g ) {
23
+ baseP += b ;
24
+ } else {
25
+ baseP += g ;
29
26
}
30
- // console.log(baseP);
31
- if ( baseP > parent . length - child . length && baseP < parent . length ) baseP = parent . length - child . length ; //防止加过的情况
32
- if ( baseP == parent . length ) return - 1 ;
27
+ break ;
28
+ }
29
+ }
30
+ // console.log(baseP);
31
+ if ( baseP > parent . length - child . length && baseP < parent . length ) {
32
+ baseP = parent . length - child . length ; // 防止加过的情况
33
33
}
34
+ if ( baseP == parent . length ) return - 1 ;
35
+ }
34
36
}
35
37
36
38
function bad ( badC , child , i ) {
37
- let sub = child . substring ( 0 , i + 1 ) ; //去除好后缀
38
- return i - sub . lastIndexOf ( badC ) ;
39
+ const sub = child . substring ( 0 , i + 1 ) ; // 去除好后缀
40
+ return i - sub . lastIndexOf ( badC ) ;
39
41
}
40
42
41
43
function good ( goodS , child ) {
42
- if ( goodS == "" ) return 0 ;
43
- //最长的好后缀至在字串中出现了一次
44
- if ( child . lastIndexOf ( goodS ) == child . indexOf ( goodS ) ) {
45
- let tmp = "" ;
46
- for ( let i = 1 ; i < goodS . length ; i ++ ) {
47
- tmp = goodS . slice ( i ) ;
48
- if ( child . indexOf ( tmp ) == 0 ) {
49
- let str = child . slice ( 0 , child . length - goodS . length ) ;
50
- let newChild = str + child ;
51
- return newChild . length - goodS . length ;
52
- }
53
- }
54
- return child . length ;
55
- } else
56
- //最长的好后缀至在字串中出现了多次
57
- {
58
- let str = child . slice ( 0 , child . length - goodS . length ) ; //去除字串末尾的最长好后缀
59
- let lastIndex = str . lastIndexOf ( goodS ) + goodS . length - 1 ; //最长好后缀的最后一个字符上一次出现的位置
60
- return goodS . length - lastIndex ;
44
+ if ( goodS == "" ) return 0 ;
45
+ // 最长的好后缀至在字串中出现了一次
46
+ if ( child . lastIndexOf ( goodS ) == child . indexOf ( goodS ) ) {
47
+ let tmp = "" ;
48
+ for ( let i = 1 ; i < goodS . length ; i ++ ) {
49
+ tmp = goodS . slice ( i ) ;
50
+ if ( child . indexOf ( tmp ) == 0 ) {
51
+ const str = child . slice ( 0 , child . length - goodS . length ) ;
52
+ const newChild = str + child ;
53
+ return newChild . length - goodS . length ;
54
+ }
61
55
}
56
+ return child . length ;
57
+ } else {
58
+ // 最长的好后缀至在字串中出现了多次
59
+ const str = child . slice ( 0 , child . length - goodS . length ) ; // 去除字串末尾的最长好后缀
60
+ const lastIndex = str . lastIndexOf ( goodS ) + goodS . length - 1 ; // 最长好后缀的最后一个字符上一次出现的位置
61
+ return goodS . length - lastIndex ;
62
+ }
62
63
}
63
64
64
65
function randomString ( len ) {
65
- len = len || 32 ;
66
- var $chars = ' ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678' ;
67
- var maxPos = $chars . length ;
68
- var pwd = '' ;
69
- for ( i = 0 ; i < len ; i ++ ) {
70
- pwd += $chars . charAt ( Math . floor ( Math . random ( ) * maxPos ) ) ;
71
- }
72
- return pwd ;
66
+ len = len || 32 ;
67
+ const $chars = " ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678" ;
68
+ const maxPos = $chars . length ;
69
+ let pwd = "" ;
70
+ for ( i = 0 ; i < len ; i ++ ) {
71
+ pwd += $chars . charAt ( Math . floor ( Math . random ( ) * maxPos ) ) ;
72
+ }
73
+ return pwd ;
73
74
}
74
75
75
-
76
-
77
- function Bf ( parent , child ) {
78
- for ( let i = 0 ; i < parent . length ; i ++ ) {
79
- let flag = 0 ;
80
- for ( let j = 0 ; j < child . length ; j ++ ) {
81
- if ( parent [ i ] == child [ j ] ) {
82
- i ++ ;
83
- flag ++ ;
84
- } else {
85
- break ;
86
- }
87
- }
88
- if ( flag == child . length ) return i - child . length ;
76
+ function Bf ( parent , child ) {
77
+ for ( let i = 0 ; i < parent . length ; i ++ ) {
78
+ let flag = 0 ;
79
+ for ( let j = 0 ; j < child . length ; j ++ ) {
80
+ if ( parent [ i ] == child [ j ] ) {
81
+ i ++ ;
82
+ flag ++ ;
83
+ } else {
84
+ break ;
85
+ }
89
86
}
90
- return - 1 ;
87
+ if ( flag == child . length ) return i - child . length ;
88
+ }
89
+ return - 1 ;
91
90
}
92
91
// fs.writeFile('str.txt', randomString(30000000), function (error) {
93
92
// if (error) {
@@ -110,25 +109,37 @@ function Bf(parent,child){
110
109
// }
111
110
// })
112
111
113
- fs . readFile ( 'str.txt' , function ( error , data ) {
114
- if ( error ) {
115
- console . log ( '读取文件失败了' )
116
- } else {
117
- console . log ( data . toString ( ) . length ) ;
118
- var startTime = new Date ( ) ;
119
- console . log ( "BM:" , Bm ( data . toString ( ) , "jc3TrXacMDytprhhbjY6WtEdFjkpkR5ARJxSWrPbp2fBjDYPzmMdYQPGGPDsPzPtAS446Gd3iMENswYBW5NcFTpBF587abHsyYjXD7ZsHrce2FRbrkkpFeBGf6Z7XFpdHhp58zziGeBRW5WCPrGBC8ecXTb3EyYyNKPypekFEEtWEfWdbkeSGDZfFiY2ESEFyKsb5pXmWBcnJAaCy2iWpM4Nm3HZ8etk2dQjexC7nKi2AAiy8JhpzPbjyZznxSKFDnxt5fK54aQw4GMSE2xycx6QTyxD6C5iZjQy4tDx24XB5krXw6bFPMRaTfZ6dXJXWZmRp6rhNeEFZdymejHDW2hFTibPehsmmj4wDFADwwmM6ds4YcEQxxMNT4RPW4jrtRRMTjabW3JisY2H2nRht6B4yHyrKC4xKQ4bXtC47rNt8jQwWMyQGsQtCp7Q4RyNb4y5mKHHCXaMfccPJinyEiJyaRxw3azJcaykmanYxkRK7njXS6We" ) )
120
- var endTime = new Date ( ) ;
121
- console . log ( "BM Time:" , endTime - startTime ) ;
122
- }
123
- } )
124
- fs . readFile ( 'str.txt' , function ( error , data ) {
125
- if ( error ) {
126
- console . log ( '读取文件失败了' )
127
- } else {
128
- console . log ( data . toString ( ) . length ) ;
129
- var startTime = new Date ( ) ;
130
- console . log ( "BF" , Bf ( data . toString ( ) , "jc3TrXacMDytprhhbjY6WtEdFjkpkR5ARJxSWrPbp2fBjDYPzmMdYQPGGPDsPzPtAS446Gd3iMENswYBW5NcFTpBF587abHsyYjXD7ZsHrce2FRbrkkpFeBGf6Z7XFpdHhp58zziGeBRW5WCPrGBC8ecXTb3EyYyNKPypekFEEtWEfWdbkeSGDZfFiY2ESEFyKsb5pXmWBcnJAaCy2iWpM4Nm3HZ8etk2dQjexC7nKi2AAiy8JhpzPbjyZznxSKFDnxt5fK54aQw4GMSE2xycx6QTyxD6C5iZjQy4tDx24XB5krXw6bFPMRaTfZ6dXJXWZmRp6rhNeEFZdymejHDW2hFTibPehsmmj4wDFADwwmM6ds4YcEQxxMNT4RPW4jrtRRMTjabW3JisY2H2nRht6B4yHyrKC4xKQ4bXtC47rNt8jQwWMyQGsQtCp7Q4RyNb4y5mKHHCXaMfccPJinyEiJyaRxw3azJcaykmanYxkRK7njXS6We" ) )
131
- var endTime = new Date ( ) ;
132
- console . log ( "BF Time:" , endTime - startTime ) ;
133
- }
134
- } )
112
+ fs . readFile ( "str.txt" , function ( error , data ) {
113
+ if ( error ) {
114
+ console . log ( "读取文件失败了" ) ;
115
+ } else {
116
+ console . log ( data . toString ( ) . length ) ;
117
+ const startTime = new Date ( ) ;
118
+ console . log (
119
+ "BM:" ,
120
+ Bm (
121
+ data . toString ( ) ,
122
+ "jc3TrXacMDytprhhbjY6WtEdFjkpkR5ARJxSWrPbp2fBjDYPzmMdYQPGGPDsPzPtAS446Gd3iMENswYBW5NcFTpBF587abHsyYjXD7ZsHrce2FRbrkkpFeBGf6Z7XFpdHhp58zziGeBRW5WCPrGBC8ecXTb3EyYyNKPypekFEEtWEfWdbkeSGDZfFiY2ESEFyKsb5pXmWBcnJAaCy2iWpM4Nm3HZ8etk2dQjexC7nKi2AAiy8JhpzPbjyZznxSKFDnxt5fK54aQw4GMSE2xycx6QTyxD6C5iZjQy4tDx24XB5krXw6bFPMRaTfZ6dXJXWZmRp6rhNeEFZdymejHDW2hFTibPehsmmj4wDFADwwmM6ds4YcEQxxMNT4RPW4jrtRRMTjabW3JisY2H2nRht6B4yHyrKC4xKQ4bXtC47rNt8jQwWMyQGsQtCp7Q4RyNb4y5mKHHCXaMfccPJinyEiJyaRxw3azJcaykmanYxkRK7njXS6We"
123
+ )
124
+ ) ;
125
+ const endTime = new Date ( ) ;
126
+ console . log ( "BM Time:" , endTime - startTime ) ;
127
+ }
128
+ } ) ;
129
+ fs . readFile ( "str.txt" , function ( error , data ) {
130
+ if ( error ) {
131
+ console . log ( "读取文件失败了" ) ;
132
+ } else {
133
+ console . log ( data . toString ( ) . length ) ;
134
+ const startTime = new Date ( ) ;
135
+ console . log (
136
+ "BF" ,
137
+ Bf (
138
+ data . toString ( ) ,
139
+ "jc3TrXacMDytprhhbjY6WtEdFjkpkR5ARJxSWrPbp2fBjDYPzmMdYQPGGPDsPzPtAS446Gd3iMENswYBW5NcFTpBF587abHsyYjXD7ZsHrce2FRbrkkpFeBGf6Z7XFpdHhp58zziGeBRW5WCPrGBC8ecXTb3EyYyNKPypekFEEtWEfWdbkeSGDZfFiY2ESEFyKsb5pXmWBcnJAaCy2iWpM4Nm3HZ8etk2dQjexC7nKi2AAiy8JhpzPbjyZznxSKFDnxt5fK54aQw4GMSE2xycx6QTyxD6C5iZjQy4tDx24XB5krXw6bFPMRaTfZ6dXJXWZmRp6rhNeEFZdymejHDW2hFTibPehsmmj4wDFADwwmM6ds4YcEQxxMNT4RPW4jrtRRMTjabW3JisY2H2nRht6B4yHyrKC4xKQ4bXtC47rNt8jQwWMyQGsQtCp7Q4RyNb4y5mKHHCXaMfccPJinyEiJyaRxw3azJcaykmanYxkRK7njXS6We"
140
+ )
141
+ ) ;
142
+ const endTime = new Date ( ) ;
143
+ console . log ( "BF Time:" , endTime - startTime ) ;
144
+ }
145
+ } ) ;
0 commit comments