-
Notifications
You must be signed in to change notification settings - Fork 15
Description
Design Add and Search Words Data Structure ๋ฌธ์ Trie ํ์ด์ ์๊ฐ ๋ณต์ก๋์ ๊ณต๊ฐ ๋ณต์ก๋๊ฐ ์ผ๋ถ O(26^w)์ O(2^w)๋ผ๊ณ ๊ณ์ฐ๋ ๊ฒ๋ณด๋ค ๋ ์ค์ฌ์ผ ๊ณ์ฐ ๊ฐ๋ฅ์ฑ ์ค๋ช
์ ์ ๋ฆฌํ ๊ฒ ๊ฐ์์ ์ ๋ณด ๋๋ฆฝ๋๋ค.
- ํ์ด 3: Trie 2
AlgoDale/src/content/problems/design-add-and-search-words-data-structure.md
Lines 322 to 324 in 990d724
| ํธ๋ผ์ด์ ๊ฐ ๋ ธ๋์์ ์ต์ ์ ๊ฒฝ์ฐ ์์ด ์ํ๋ฒณ ์๋ฌธ์ `26`๊ฐ๊ฐ ๋ค์ ๊ธ์๊ฐ ๋ ์ ์๊ธฐ ๋๋ฌธ์ ์ต๋ `26`๋ฒ์ ์ฌ๊ท ํธ์ถ์ด ์ผ์ด๋ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. | |
| ๊ทธ๋ฆฌ๊ณ ํธ์ถ ์คํ์ ์ฐพ์ผ๋ ค๋ ๋จ์ด์ ๋ค์ด์๋ ๊ธ์์ ์์ ๋น๋กํด์ ๊น์ด์ง๊ธฐ ๋๋ฌธ์ ๋๋ค. | |
| ๋ฐ๋ผ์ `search()` ๋ฉ์๋๋ ์๊ฐ ๋ณต์ก๋๋ `O(26^w)`๊ฐ ๋๊ณ , ๊ณต๊ฐ ๋ณต์ก๋๋ `O(w)`๊ฐ ๋ฉ๋๋ค. |
O(26^w)๋ณด๋ค ๋ ๋ฎ์ ์ํ์ด ์์ต๋๋ค.
๋ฌธ์ ์ ๋ค์ ์กฐ๊ฑด์ด ์์ผ๋ฏ๋ก ๊ฒฝ์ฐ๋ฅผ ๋๋์ด ์
์ ์์ต๋๋ค:
There will be at most
2dots inwordforsearchqueries.
dot์ ๊ฐ์๊ฐ 0์ธ ์ต์ ์ ๊ฒฝ์ฐ ํธ๋ผ์ด์ ๊ฐ ๋
ธ๋์์ ๋ค์ ๊ธ์์ Branch๊ฐ 1๊ฐ์ด๋ฏ๋ก ๋งค๋ฒ 1๋ฒ์ ์ฌ๊ท ํธ์ถ์ด ์ผ์ด๋ฉ๋๋ค.
์ฆ O(w * 1^w) = O(w)์
๋๋ค.
dot์ ๊ฐ์๊ฐ 1์ด๋ฉด w๋ฒ ์ค 1๋ฒ์ Branch๊ฐ ์ต์
์ ๊ฒฝ์ฐ 26๊ฐ์ผ ๋ ๋ค์ ์ฌ๊ท ํธ์ถ์ด 26๋ฒ ์ผ์ด๋ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ๊ทธ 1๋ฒ์ ์ ์ธํ ๋๋จธ์ง (w - 1)๋ฒ์ Branch๊ฐ 1๊ฐ๋ผ์ ์ด์ ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๋งค๋ฒ 1๋ฒ์ ์ฌ๊ท ํธ์ถ์ด ์ผ์ด๋ฉ๋๋ค.
๋ฐ๋ผ์ O(w * 26 * 1^(w - 1)) = O(w)์
๋๋ค.
์ต์
์ ๊ฒฝ์ฐ๋ dot์ ๊ฐ์๊ฐ 2์ด๋ฉด์ 2๋ฒ ๋ค Branch๊ฐ 26๊ฐ๋ผ๋ฉด ๋ค์ ์ฌ๊ท ํธ์ถ์ด 26๋ฒ์ธ ๊ฒฝ์ฐ๊ฐ 2๋ฒ์ฉ ์์ ์ ์์ต๋๋ค.
ํ์ง๋ง ๊ทธ 2๋ฒ์ ์ ์ธํ๋ฉด ์ฌ์ ํ 1๊ฐ์ Branch์ ๋ํด ๋งค๋ฒ ์ฌ๊ท ํธ์ถ์ด 1๋ฒ๋ง ์ผ์ด๋ฉ๋๋ค.
๊ทธ๋์ O(w * 26^2 * 1^(w - 2)) = O(w)์
๋๋ค.
๋ค์ ๋งํด O(26^w)์ O(w * (1 + 26 + 26^2)) = O(w)์ผ๋ก ์ค์ผ ์ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ฌธ์ ์ ๋ค์ ์กฐ๊ฑด๊ณผ ๊ฒฐํฉํ๋ฉด w * (1 + 26 + 26^2) = 25 * (1 + 26 + 676) = 25 * 703 = 17575์ด๋ผ์ ๊ฝค ํฝ๋๋ค:
1 <= word.length <= 25
๊ฒฐ๋ก ์ ์ผ๋ก ๋ค์ ์กฐ๊ฑด์ ๋ฐ๋ผ ์ต๋ 17575 * 10^4๋ฒ์ด๋ผ ์์ฌ์์ฌํฉ๋๋ค:
At most
10^4calls will be made toaddWordandsearch.
- ํ์ด 2: Trie 1
AlgoDale/src/content/problems/design-add-and-search-words-data-structure.md
Lines 157 to 172 in 990d724
| def addWord(self, word: str) -> None: | |
| def dfs(node, idx): | |
| if idx == len(word): | |
| node["$"] = True | |
| return | |
| if "." not in node: | |
| node["."] = {"$": False} | |
| dfs(node["."], idx + 1) | |
| ch = word[idx] | |
| if ch not in node: | |
| node[ch] = {"$": False} | |
| dfs(node[ch], idx + 1) | |
| dfs(self.root, 0) |
AlgoDale/src/content/problems/design-add-and-search-words-data-structure.md
Lines 183 to 184 in 990d724
| ๋จ์ด๋ฅผ ์ถ๊ฐํ ๋, ์ฌ๊ท ํจ์ ๋ด์์ 2๋ฒ์ ์ฐ์ ํธ์ถ์ด ์ผ์ด๋๋ฉฐ, ํธ์ถ ํธ๋ฆฌ์ ๊น์ด๋ ๊ธ์์ ์์ ๋น๋กํฉ๋๋ค. | |
| ๋ฐ๋ผ์ `addWord()` ๋ฉ์๋์ ์๊ฐ ๋ณต์ก๋์ ๊ณต๊ฐ ๋ณต์ก๋๋ ๋ชจ๋ `O(2^w)`์ด ๋ฉ๋๋ค. |
์ด๋ฒ์๋ O(2^w)์ ์ค๋ช
์ผ๋ก ์ถฉ๋ถํฉ๋๋ค.
๊ทธ๋ฐ๋ฐ ์์ ์ธ๊ธํ ๋ฌธ์ ์ ์กฐ๊ฑด์ ํ์ฉํ๋ฉด ์ฝ๊ฐ์ ๋ณํ์ผ๋ก ์ํ์ ๋ ์ค์ธ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค:
There will be at most
2dots inwordforsearchqueries.
def addWord(self, word: str) -> None:
def dfs(node, idx, chance):
if idx == len(word):
node["$"] = True
return
if chance > 0:
if "." not in node:
node["."] = {"$": False}
dfs(node["."], idx + 1, chance - 1)
ch = word[idx]
if ch not in node:
node[ch] = {"$": False}
dfs(node[ch], idx + 1, chance)
dfs(self.root, 0, 2)์ญ์ ๊ฒฝ์ฐ๋ฅผ ๋๋์ด ์
์ ์์ต๋๋ค.
dot์ ๊ฐ์๊ฐ 0์ธ ๋ฌธ์์ด, 1์ธ ๋ฌธ์์ด, 2์ธ ๋ฌธ์์ด์ด ์์ฑ๋ฉ๋๋ค.
dot์ ๊ฐ์๊ฐ 0์ธ ๋ฌธ์์ด์ 1๊ฐ, 1์ธ ๋ฌธ์์ด์ 26๊ฐ, 2์ธ ๋ฌธ์์ด์ 26 choose 2 = 26 * 25 / 2 = 325๊ฐ์
๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ฌธ์์ด๋ง๋ค ์ต์
์ ๊ฒฝ์ฐ ๋งค๋ฒ ์๋ก์ด w๊ฐ์ ๋
ธ๋๋ฅผ ์ค๋ณต ์์ด ์ฒ์์ผ๋ก ๋ฐฉ๋ฌธํ๊ฑฐ๋ ์์ฑํ ์ ์์ต๋๋ค.
๋ค์ ๋งํด O(2^w)๋ฅผ O(w * sum(k in [0, 2], 26 choose k)) = O(w * (1 + 26 + 325)) = O(352w) = O(w)์ผ๋ก ๋ฎ์ถ ์ ์์ต๋๋ค.
์ด๋ฒ์๋ ์ด์ O(w) ํ์ด๋ณด๋ค w๋ฐฐ ๋ ํฌ๊ฒ ๊ณ์ฐ๋๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ์ ๋ค์ ์กฐ๊ฑด๊ณผ ๊ฒฐํฉํ๋ฉด ์ฌ์ ์์ด ์ด๊ณผํ๋ ์ด์ ๋ฅผ ์ค๋ช
ํ ์ ์์ต๋๋ค:
1 <= word.length <= 25
๊ทธ๋์ ์ต์
์ ๊ฒฝ์ฐ 352w = 352 * 25 = 8800์ด๋ผ 8800 * 10^4 = 88 * 10^6๋ฒ์ด๋ฉด ์๊ฐ์ ๋์์ง ์์ต๋๋ค:
At most
10^4calls will be made toaddWordandsearch.
๊ทธ๋ฌ๋ ๊ณต๊ฐ์ ์ ์ด๋ 4๋ฐ์ดํธ์ฉ ๊ณ์ฐํ๋๋ผ๋ 4 * 88 * 10^6 B = 352 MB์ด๋ฏ๋ก ์ด ์ฝ๋๋ ๋ฉ๋ชจ๋ฆฌ ์ด๊ณผ๋ฅผ ํด๊ฒฐํ์ง ๋ชปํฉ๋๋ค.
ํํธ ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ์์๋ ๊ณต๊ฐ์ด ์๊ฐ๋ณด๋ค 4๋ฐฐ ์ด์ ๋น์ผ ๊ฒฝ์ฐ๊ฐ ์๋ค๋ ๊ตํ์ ์ป์ ์ ์๊ตฐ์!
1์ด์ ์๊ฐ์ ํ์ฉํ๋ฉด์๋ ๋น์ทํ ๋ณต์ก๋์ ๊ณต๊ฐ 400MB ์ด์์ ๋ถํํ๋ค๋ฉด์.
ํน์ ์ด ์ฝ๋์ ๋ณต์ก๋ ์ํ์ ๋ ๋ฎ์ถฐ์ ๊ณ์ฐํ๊ฑฐ๋ ์ด๋ฅผ ์ํด ์ถ๊ฐ๋ก ์ฝ๋๋ฅผ ๋ณํํ ์์ด๋์ด๊ฐ ์์ผ์ ๋ถ๊ป์๋ ๊ณต์ ํด ์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค!