-
Notifications
You must be signed in to change notification settings - Fork 14.6k
Add kotlin code for the chapter of hashing #1104
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from all commits
Commits
Show all changes
14 commits
Select commit
Hold shift + click to select a range
b3e5554
feat(kotlin): add kotlin code for dynamic programming.
DongH-Chen 8abcec4
Update knapsack.kt
curtishd 3f1f5b7
Merge branch 'krahets:main' into main
curtishd 65f1570
feat(kotlin): add kotlin codes for graph.
DongH-Chen 19cb81f
style(kotlin): reformatted the codes.
DongH-Chen 3962695
Merge branch 'krahets:main' into main
curtishd ffbfc00
feat(kotlin): add kotlin codes for the chapter of greedy.
DongH-Chen 0eae024
Update max_product_cutting.kt
curtishd 931e2ad
Merge branch 'krahets:main' into main
curtishd 57258e9
feat(kotlin): add kotlin code for chapter of hashing.
DongH-Chen 5109aa7
style(kotlin): modified some comment
DongH-Chen 2291c1e
Update array_hash_map.kt
curtishd c6daf7e
Update hash_map_chaining.kt
curtishd 42461b1
Update hash_map_chaining.kt
curtishd File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,130 @@ | ||
| /** | ||
| * File: array_hash_map.kt | ||
| * Created Time: 2024-01-25 | ||
| * Author: curtishd ([email protected]) | ||
| */ | ||
|
|
||
| package chapter_hashing | ||
|
|
||
| /* 键值对 */ | ||
| class Pair( | ||
| var key: Int, | ||
| var value: String | ||
| ) | ||
|
|
||
| /* 基于数组实现的哈希表 */ | ||
| class ArrayHashMap { | ||
| private val buckets = arrayOfNulls<Pair>(100) | ||
|
|
||
| /* 构造方法 */ | ||
| init { | ||
| // 初始化数组,包含 100 个桶 | ||
| for (i in 0..<100) { | ||
| buckets[i] = null | ||
| } | ||
| } | ||
|
|
||
| /* 哈希函数 */ | ||
| fun hashFunc(key: Int): Int { | ||
| val index = key % 100 | ||
| return index | ||
| } | ||
|
|
||
| /* 查询操作 */ | ||
| fun get(key: Int): String? { | ||
| val index = hashFunc(key) | ||
| val pair = buckets[index] ?: return null | ||
| return pair.value | ||
| } | ||
|
|
||
| /* 添加操作 */ | ||
| fun put(key: Int, value: String) { | ||
| val pair = Pair(key, value) | ||
| val index = hashFunc(key) | ||
| buckets[index] = pair | ||
| } | ||
|
|
||
| /* 删除操作 */ | ||
| fun remove(key: Int) { | ||
| val index = hashFunc(key) | ||
| // 置为 null ,代表删除 | ||
| buckets[index] = null | ||
| } | ||
|
|
||
| /* 获取所有键值对 */ | ||
| fun pairSet(): MutableList<Pair> { | ||
| val pairSet = ArrayList<Pair>() | ||
| for (pair in buckets) { | ||
| if (pair != null) pairSet.add(pair) | ||
| } | ||
| return pairSet | ||
| } | ||
|
|
||
| /* 获取所有键 */ | ||
| fun keySet(): MutableList<Int> { | ||
| val keySet = ArrayList<Int>() | ||
| for (pair in buckets) { | ||
| if (pair != null) keySet.add(pair.key) | ||
| } | ||
| return keySet | ||
| } | ||
|
|
||
| /* 获取所有值 */ | ||
| fun valueSet(): MutableList<String> { | ||
| val valueSet = ArrayList<String>() | ||
| for (pair in buckets) { | ||
| pair?.let { valueSet.add(it.value) } | ||
| } | ||
| return valueSet | ||
| } | ||
|
|
||
| /* 打印哈希表 */ | ||
| fun print() { | ||
| for (kv in pairSet()) { | ||
| val key = kv.key | ||
| val value = kv.value | ||
| println("${key}->${value}") | ||
| } | ||
| } | ||
| } | ||
|
|
||
| /* Driver Code */ | ||
| fun main() { | ||
| /* 初始化哈希表 */ | ||
| val map = ArrayHashMap() | ||
|
|
||
| /* 添加操作 */ | ||
| // 在哈希表中添加键值对 (key, value) | ||
| map.put(12836, "小哈") | ||
| map.put(15937, "小啰") | ||
| map.put(16750, "小算") | ||
| map.put(13276, "小法") | ||
| map.put(10583, "小鸭") | ||
| println("\n添加完成后,哈希表为\nKey -> Value") | ||
| map.print() | ||
|
|
||
| /* 查询操作 */ | ||
| // 向哈希表中输入键 key ,得到值 value | ||
| val name: String? = map.get(15937) | ||
| println("\n输入学号 15937 ,查询到姓名 $name") | ||
|
|
||
| /* 删除操作 */ | ||
| // 在哈希表中删除键值对 (key, value) | ||
| map.remove(10583) | ||
| println("\n删除 10583 后,哈希表为\nKey -> Value") | ||
| map.print() | ||
|
|
||
| /* 遍历哈希表 */ | ||
| println("\n遍历键值对 Key->Value") | ||
| for (kv in map.pairSet()) { | ||
| println("${kv.key} -> ${kv.value}") | ||
| } | ||
| println("\n单独遍历键 Key") | ||
| for (key in map.keySet()) { | ||
| println(key) | ||
| } | ||
| println("\n单独遍历值 Value") | ||
| for (value in map.valueSet()) { | ||
| println(value) | ||
| } | ||
| } | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,36 @@ | ||
| /** | ||
| * File: built_in_hash.kt | ||
| * Created Time: 2024-01-25 | ||
| * Author: curtishd ([email protected]) | ||
| */ | ||
|
|
||
| package chapter_hashing | ||
|
|
||
| import utils.ListNode | ||
|
|
||
| /* Driver Code */ | ||
| fun main() { | ||
curtishd marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| val num = 3 | ||
| val hashNum = Integer.hashCode(num) | ||
| println("整数 $num 的哈希值为 $hashNum") | ||
|
|
||
| val bol = true | ||
| val hashBol = Boolean.hashCode() | ||
| println("布尔量 $bol 的哈希值为 $hashBol") | ||
|
|
||
| val dec = 3.14159 | ||
| val hashDec = java.lang.Double.hashCode(dec) | ||
| println("小数 $dec 的哈希值为 $hashDec") | ||
|
|
||
| val str = "Hello 算法" | ||
| val hashStr = str.hashCode() | ||
| println("字符串 $str 的哈希值为 $hashStr") | ||
|
|
||
| val arr = arrayOf<Any>(12836, "小哈") | ||
| val hashTup = arr.contentHashCode() | ||
| println("数组 ${arr.contentToString()} 的哈希值为 ${hashTup}") | ||
|
|
||
| val obj = ListNode(0) | ||
| val hashObj = obj.hashCode() | ||
| println("节点对象 $obj 的哈希值为 $hashObj") | ||
| } | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,50 @@ | ||
| /** | ||
| * File: hash_map.kt | ||
| * Created Time: 2024-01-25 | ||
| * Author: curtishd ([email protected]) | ||
| */ | ||
|
|
||
| package chapter_hashing | ||
|
|
||
| import utils.printHashMap | ||
|
|
||
| /* Driver Code */ | ||
| fun main() { | ||
curtishd marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| /* 初始化哈希表 */ | ||
| val map: MutableMap<Int, String> = HashMap() | ||
|
|
||
| /* 添加操作 */ | ||
| // 在哈希表中添加键值对 (key, value) | ||
| map[12836] = "小哈" | ||
| map[15937] = "小啰" | ||
| map[16750] = "小算" | ||
| map[13276] = "小法" | ||
| map[10583] = "小鸭" | ||
| println("\n添加完成后,哈希表为\nKey -> Value") | ||
| printHashMap(map) | ||
|
|
||
| /* 查询操作 */ | ||
| // 向哈希表中输入键 key ,得到值 value | ||
| val name = map[15937] | ||
| println("\n输入学号 15937 ,查询到姓名 $name") | ||
|
|
||
| /* 删除操作 */ | ||
| // 在哈希表中删除键值对 (key, value) | ||
| map.remove(10583) | ||
| println("\n删除 10583 后,哈希表为\nKey -> Value") | ||
| printHashMap(map) | ||
|
|
||
| /* 遍历哈希表 */ | ||
| println("\n遍历键值对 Key->Value") | ||
| for ((key, value) in map) { | ||
| println("$key -> $value") | ||
| } | ||
| println("\n单独遍历键 Key") | ||
| for (key in map.keys) { | ||
| println(key) | ||
| } | ||
| println("\n单独遍历值 Value") | ||
| for (value in map.values) { | ||
| println(value) | ||
| } | ||
| } | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,145 @@ | ||
| /** | ||
| * File: hash_map_chaining.kt | ||
| * Created Time: 2024-01-25 | ||
| * Author: curtishd ([email protected]) | ||
| */ | ||
|
|
||
| package chapter_hashing | ||
|
|
||
| /* 链式地址哈希表 */ | ||
| class HashMapChaining() { | ||
| var size: Int // 键值对数量 | ||
| var capacity: Int // 哈希表容量 | ||
| val loadThres: Double // 触发扩容的负载因子阈值 | ||
| val extendRatio: Int // 扩容倍数 | ||
| var buckets: MutableList<MutableList<Pair>> // 桶数组 | ||
|
|
||
| /* 构造方法 */ | ||
| init { | ||
| size = 0 | ||
| capacity = 4 | ||
| loadThres = 2.0 / 3.0 | ||
| extendRatio = 2 | ||
| buckets = ArrayList(capacity) | ||
| for (i in 0..<capacity) { | ||
| buckets.add(mutableListOf()) | ||
| } | ||
| } | ||
|
|
||
| /* 哈希函数 */ | ||
| fun hashFunc(key: Int): Int { | ||
| return key % capacity | ||
| } | ||
|
|
||
| /* 负载因子 */ | ||
| fun loadFactor(): Double { | ||
| return (size / capacity).toDouble() | ||
| } | ||
|
|
||
| /* 查询操作 */ | ||
| fun get(key: Int): String? { | ||
| val index = hashFunc(key) | ||
| val bucket = buckets[index] | ||
| // 遍历桶,若找到 key ,则返回对应 val | ||
| for (pair in bucket) { | ||
| if (pair.key == key) return pair.value | ||
| } | ||
| // 若未找到 key ,则返回 null | ||
| return null | ||
| } | ||
|
|
||
| /* 添加操作 */ | ||
| fun put(key: Int, value: String) { | ||
| // 当负载因子超过阈值时,执行扩容 | ||
| if (loadFactor() > loadThres) { | ||
| extend() | ||
| } | ||
| val index = hashFunc(key) | ||
| val bucket = buckets[index] | ||
| // 遍历桶,若遇到指定 key ,则更新对应 val 并返回 | ||
| for (pair in bucket) { | ||
| if (pair.key == key) { | ||
| pair.value = value | ||
| return | ||
| } | ||
| } | ||
| // 若无该 key ,则将键值对添加至尾部 | ||
| val pair = Pair(key, value) | ||
| bucket.add(pair) | ||
| size++ | ||
| } | ||
|
|
||
| /* 删除操作 */ | ||
| fun remove(key: Int) { | ||
| val index = hashFunc(key) | ||
| val bucket = buckets[index] | ||
| // 遍历桶,从中删除键值对 | ||
| for (pair in bucket) { | ||
| if (pair.key == key) { | ||
| bucket.remove(pair) | ||
| size-- | ||
| break | ||
| } | ||
| } | ||
| } | ||
|
|
||
| /* 扩容哈希表 */ | ||
| fun extend() { | ||
| // 暂存原哈希表 | ||
| val bucketsTmp = buckets | ||
| // 初始化扩容后的新哈希表 | ||
| capacity *= extendRatio | ||
| // mutablelist 无固定大小 | ||
| buckets = mutableListOf() | ||
| for (i in 0..<capacity) { | ||
| buckets.add(mutableListOf()) | ||
| } | ||
| size = 0 | ||
| // 将键值对从原哈希表搬运至新哈希表 | ||
| for (bucket in bucketsTmp) { | ||
| for (pair in bucket) { | ||
| put(pair.key, pair.value) | ||
| } | ||
| } | ||
| } | ||
|
|
||
| /* 打印哈希表 */ | ||
| fun print() { | ||
| for (bucket in buckets) { | ||
| val res = mutableListOf<String>() | ||
| for (pair in bucket) { | ||
| val k = pair.key | ||
| val v = pair.value | ||
| res.add("$k -> $v") | ||
| } | ||
| println(res) | ||
| } | ||
| } | ||
| } | ||
|
|
||
| /* Driver Code */ | ||
| fun main() { | ||
| /* 初始化哈希表 */ | ||
| val map = HashMapChaining() | ||
|
|
||
| /* 添加操作 */ | ||
| // 在哈希表中添加键值对 (key, value) | ||
| map.put(12836, "小哈") | ||
| map.put(15937, "小啰") | ||
| map.put(16750, "小算") | ||
| map.put(13276, "小法") | ||
| map.put(10583, "小鸭") | ||
| println("\n添加完成后,哈希表为\nKey -> Value") | ||
| map.print() | ||
|
|
||
| /* 查询操作 */ | ||
| // 向哈希表中输入键 key ,得到值 value | ||
| val name = map.get(13276) | ||
| println("\n输入学号 13276 ,查询到姓名 $name") | ||
|
|
||
| /* 删除操作 */ | ||
| // 在哈希表中删除键值对 (key, value) | ||
| map.remove(12836) | ||
| println("\n删除 12836 后,哈希表为\nKey -> Value") | ||
| map.print() | ||
| } |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.