//不熟悉js的undefined,全寫成null了
function
getmap()
for(
let i=
0;i<
26;i++
)return words
}//在node下獲取key對應的val,d是即將比較的字串的長度,如d=2表示即將用key的第2個字元與樹對應的節點進行比較
function
get(node,key,d=0)
//在node下設定key對應的值是val,沒有建立有就覆蓋,d是即將比較的字串的長度
實現深複製的效果,避免位址引用
function
put(node,key,val,d=0)
}if(d==key.length)
else
return node
}//keyswithprefix:返回node節點下以pre開頭的所有key,設定預設值的引數必須放最後,否則報錯,d是即將比較的字串的長度
function
keyswithprefix
(node,pre,list=
,d=0)if
(node.val!=
null
&&d>=pre.length)
if(d>=pre.length)}}
else
return list
}//keysthatmatch:返回匹配的字串,如果a.b對應a[a-z]b
function
keysthamatch
(node,match,list=
,pre="")
if(node.val!=
null
&&pre.length==match.length)
for(
let x in node.next)}}
return list
}//longestprefixof:返回給定字串最長公共字首的key,d1是目前此key的長度,d2是即將比較的字串的長度
//第一次執行時,d2=0表示即將比較根節點和match
function
longestprefixof
(node,match,d1=
0,d2=0)
if(node.val!=
null
)return
longestprefixof
(node.next[match[d2]
],match,d1,d2+1)
}//delete:d是即將比較的字串的長度,刪除key對應節點後,需要把無子節點且沒有val的節點也刪除
function
delete_
(node,key,d=0)
if(d==key.length)
else
for(
let i in node.next)
}return
null
//return null不能省略,因為js沒有返回值時返回undefined,實際邏輯需要null
}//***********************************===
var root=
null
let j1=
require
('./1'
)let mylength=
10000
randomwords=j1.
getwords
(mylength,1,
5)randomwords.
foreach
((x)
=>
)//put隨機字串到以root為根節點的樹
console.
log(
"\n\n\n\n\nrandomwords=\n"
,randomwords)
randomwords.
foreach
((x)
=>})
console.
log(
'\n\n\n-->test keyswithprefix'
)console.
log(
keyswithprefix
(root,
"a")
)//列印以'a'開頭的字串
console.
log(
keyswithprefix
(root,"")
)//列印以所有字串
console.
log(
keyswithprefix
(root,"")
.length)
//長度可能不到mylength,因為有重複的可以key:val
let matchstr=
"..."
console.
log(
'\n\n\n-->test keysthanmatch '
+matchstr)
console.
log(list=
keysthanmatch
(root,matchstr)
)let prefixstr=
"abcd"
console.
log(
'\n\n\n-->test longestprefixof '
+prefixstr)
console.
log(
longestprefixof
(root,prefixstr)
)console.
log(
'\n\n\n-->test delete'
)root=
put(root,
'aaaaaa'
,'a6val'
)root=
put(root,
'aaaaaaaa'
,'a8val'
)console.
log(
keyswithprefix
(root,"",
))console.
log(
get(root,
"aaaaaaaa"))
console.
log(
get(root,
"aaaaaaa"))
console.
log(
get(root,
"aaaaaa"))
console.
log(
get(root,
"aaaaa"))
root=
delete_
(root,
'aaaaaaaa'
)root=
delete_
(root,
'a')
console.
log(
keyswithprefix
(root,"",
))console.
log(
get(root,
"aaaaaaaa"))
console.
log(
get(root,
"aaaaaaa"))
console.
log(
get(root,
"aaaaaa"))
console.
log(
get(root,
"aaaaa"))
//*************************= 1.js**
exports.
getwords
=function
getwords
(maxcount=
20,minlen=
0,maxlen=11)
words.
push
(arr)
}return words
}exports.
char2int
=(a)
=>
單詞查詢樹
兩種方法 給出一些列號碼,若果任乙個號碼不在另乙個中充當字首,那麼這系列號碼是合理的輸出yes,否則輸出no 思路 標頭檔案中find函式的使用,按長度從小到大排列,那麼能當另乙個號碼字首的只能是前乙個當後乙個的字首,所以乙個乙個找 時間複雜度 o n include include include...
單詞查詢樹
一 概念 從上面的圖中,我們或多或少的可以發現一些好玩的特性。第一 根節點不包含字元,除根節點外的每乙個子節點都包含乙個字元。第二 從根節點到某一節點,路徑上經過的字元連線起來,就是該節點對應的字串。第三 每個單詞的公共字首作為乙個字元節點儲存。二 使用範圍 既然學trie樹,我們肯定要知道這玩意是...
單詞查詢樹
在進行文法分析的時候,通常需要檢測乙個單詞是否在我們的單詞列表裡。為了提高查詢和定位的速度,通常都畫出與單詞列表所對應的單詞查詢樹,其特點如下 1 根結點不包含字母,除根結點外每乙個結點都僅包含乙個大寫英文本母 2 從根結點到某一結點,路徑上經過的字母依次連起來所構成的字母序列,稱為該結點對應的單詞...