mirror of
https://github.com/krahets/hello-algo.git
synced 2025-07-28 12:52:57 +08:00
build
This commit is contained in:
@ -465,33 +465,6 @@ comments: true
|
|||||||
val v: Int // 物品价值
|
val v: Int // 物品价值
|
||||||
)
|
)
|
||||||
|
|
||||||
/* 分数背包:贪心 */
|
|
||||||
fun fractionalKnapsack(wgt: IntArray, _val: IntArray, c: Int): Double {
|
|
||||||
// 创建物品列表,包含两个属性:重量、价值
|
|
||||||
var cap = c
|
|
||||||
val items = arrayOfNulls<Item>(wgt.size)
|
|
||||||
for (i in wgt.indices) {
|
|
||||||
items[i] = Item(wgt[i], _val[i])
|
|
||||||
}
|
|
||||||
// 按照单位价值 item.v / item.w 从高到低进行排序
|
|
||||||
items.sortBy { item: Item? -> -(item!!.v.toDouble() / item.w) }
|
|
||||||
// 循环贪心选择
|
|
||||||
var res = 0.0
|
|
||||||
for (item in items) {
|
|
||||||
if (item!!.w <= cap) {
|
|
||||||
// 若剩余容量充足,则将当前物品整个装进背包
|
|
||||||
res += item.v
|
|
||||||
cap -= item.w
|
|
||||||
} else {
|
|
||||||
// 若剩余容量不足,则将当前物品的一部分装进背包
|
|
||||||
res += item.v.toDouble() / item.w * cap
|
|
||||||
// 已无剩余容量,因此跳出循环
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return res
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 分数背包:贪心 */
|
/* 分数背包:贪心 */
|
||||||
fun fractionalKnapsack(wgt: IntArray, _val: IntArray, c: Int): Double {
|
fun fractionalKnapsack(wgt: IntArray, _val: IntArray, c: Int): Double {
|
||||||
// 创建物品列表,包含两个属性:重量、价值
|
// 创建物品列表,包含两个属性:重量、价值
|
||||||
|
@ -1587,77 +1587,6 @@ index = hash(key) % capacity
|
|||||||
var _val: String
|
var _val: String
|
||||||
)
|
)
|
||||||
|
|
||||||
/* 基于数组实现的哈希表 */
|
|
||||||
class ArrayHashMap {
|
|
||||||
// 初始化数组,包含 100 个桶
|
|
||||||
private val buckets = arrayOfNulls<Pair>(100)
|
|
||||||
|
|
||||||
/* 哈希函数 */
|
|
||||||
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._val
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 添加操作 */
|
|
||||||
fun put(key: Int, _val: String) {
|
|
||||||
val pair = Pair(key, _val)
|
|
||||||
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 = mutableListOf<Pair>()
|
|
||||||
for (pair in buckets) {
|
|
||||||
if (pair != null)
|
|
||||||
pairSet.add(pair)
|
|
||||||
}
|
|
||||||
return pairSet
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 获取所有键 */
|
|
||||||
fun keySet(): MutableList<Int> {
|
|
||||||
val keySet = mutableListOf<Int>()
|
|
||||||
for (pair in buckets) {
|
|
||||||
if (pair != null)
|
|
||||||
keySet.add(pair.key)
|
|
||||||
}
|
|
||||||
return keySet
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 获取所有值 */
|
|
||||||
fun valueSet(): MutableList<String> {
|
|
||||||
val valueSet = mutableListOf<String>()
|
|
||||||
for (pair in buckets) {
|
|
||||||
pair?.let { valueSet.add(it._val) }
|
|
||||||
}
|
|
||||||
return valueSet
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 打印哈希表 */
|
|
||||||
fun print() {
|
|
||||||
for (kv in pairSet()) {
|
|
||||||
val key = kv.key
|
|
||||||
val _val = kv._val
|
|
||||||
println("${key} -> ${_val}")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 基于数组实现的哈希表 */
|
/* 基于数组实现的哈希表 */
|
||||||
class ArrayHashMap {
|
class ArrayHashMap {
|
||||||
// 初始化数组,包含 100 个桶
|
// 初始化数组,包含 100 个桶
|
||||||
|
@ -1372,15 +1372,23 @@ comments: true
|
|||||||
=== "Kotlin"
|
=== "Kotlin"
|
||||||
|
|
||||||
```kotlin title="quick_sort.kt"
|
```kotlin title="quick_sort.kt"
|
||||||
/* 快速排序 */
|
/* 快速排序(尾递归优化) */
|
||||||
fun quickSort(nums: IntArray, left: Int, right: Int) {
|
fun quickSortTailCall(nums: IntArray, left: Int, right: Int) {
|
||||||
// 子数组长度为 1 时终止递归
|
// 子数组长度为 1 时终止
|
||||||
if (left >= right) return
|
var l = left
|
||||||
// 哨兵划分
|
var r = right
|
||||||
val pivot = partition(nums, left, right)
|
while (l < r) {
|
||||||
// 递归左子数组、右子数组
|
// 哨兵划分操作
|
||||||
quickSort(nums, left, pivot - 1)
|
val pivot = partition(nums, l, r)
|
||||||
quickSort(nums, pivot + 1, right)
|
// 对两个子数组中较短的那个执行快速排序
|
||||||
|
if (pivot - l < r - pivot) {
|
||||||
|
quickSort(nums, l, pivot - 1) // 递归排序左子数组
|
||||||
|
l = pivot + 1 // 剩余未排序区间为 [pivot + 1, right]
|
||||||
|
} else {
|
||||||
|
quickSort(nums, pivot + 1, r) // 递归排序右子数组
|
||||||
|
r = pivot - 1 // 剩余未排序区间为 [left, pivot - 1]
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -1546,77 +1546,6 @@ The following code implements a simple hash table. Here, we encapsulate `key` an
|
|||||||
var _val: String
|
var _val: String
|
||||||
)
|
)
|
||||||
|
|
||||||
/* 基于数组实现的哈希表 */
|
|
||||||
class ArrayHashMap {
|
|
||||||
// 初始化数组,包含 100 个桶
|
|
||||||
private val buckets = arrayOfNulls<Pair>(100)
|
|
||||||
|
|
||||||
/* 哈希函数 */
|
|
||||||
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._val
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 添加操作 */
|
|
||||||
fun put(key: Int, _val: String) {
|
|
||||||
val pair = Pair(key, _val)
|
|
||||||
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 = mutableListOf<Pair>()
|
|
||||||
for (pair in buckets) {
|
|
||||||
if (pair != null)
|
|
||||||
pairSet.add(pair)
|
|
||||||
}
|
|
||||||
return pairSet
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 获取所有键 */
|
|
||||||
fun keySet(): MutableList<Int> {
|
|
||||||
val keySet = mutableListOf<Int>()
|
|
||||||
for (pair in buckets) {
|
|
||||||
if (pair != null)
|
|
||||||
keySet.add(pair.key)
|
|
||||||
}
|
|
||||||
return keySet
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 获取所有值 */
|
|
||||||
fun valueSet(): MutableList<String> {
|
|
||||||
val valueSet = mutableListOf<String>()
|
|
||||||
for (pair in buckets) {
|
|
||||||
pair?.let { valueSet.add(it._val) }
|
|
||||||
}
|
|
||||||
return valueSet
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 打印哈希表 */
|
|
||||||
fun print() {
|
|
||||||
for (kv in pairSet()) {
|
|
||||||
val key = kv.key
|
|
||||||
val _val = kv._val
|
|
||||||
println("${key} -> ${_val}")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 基于数组实现的哈希表 */
|
/* 基于数组实现的哈希表 */
|
||||||
class ArrayHashMap {
|
class ArrayHashMap {
|
||||||
// 初始化数组,包含 100 个桶
|
// 初始化数组,包含 100 个桶
|
||||||
|
@ -465,33 +465,6 @@ comments: true
|
|||||||
val v: Int // 物品價值
|
val v: Int // 物品價值
|
||||||
)
|
)
|
||||||
|
|
||||||
/* 分數背包:貪婪 */
|
|
||||||
fun fractionalKnapsack(wgt: IntArray, _val: IntArray, c: Int): Double {
|
|
||||||
// 建立物品串列,包含兩個屬性:重量、價值
|
|
||||||
var cap = c
|
|
||||||
val items = arrayOfNulls<Item>(wgt.size)
|
|
||||||
for (i in wgt.indices) {
|
|
||||||
items[i] = Item(wgt[i], _val[i])
|
|
||||||
}
|
|
||||||
// 按照單位價值 item.v / item.w 從高到低進行排序
|
|
||||||
items.sortBy { item: Item? -> -(item!!.v.toDouble() / item.w) }
|
|
||||||
// 迴圈貪婪選擇
|
|
||||||
var res = 0.0
|
|
||||||
for (item in items) {
|
|
||||||
if (item!!.w <= cap) {
|
|
||||||
// 若剩餘容量充足,則將當前物品整個裝進背包
|
|
||||||
res += item.v
|
|
||||||
cap -= item.w
|
|
||||||
} else {
|
|
||||||
// 若剩餘容量不足,則將當前物品的一部分裝進背包
|
|
||||||
res += item.v.toDouble() / item.w * cap
|
|
||||||
// 已無剩餘容量,因此跳出迴圈
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return res
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 分數背包:貪婪 */
|
/* 分數背包:貪婪 */
|
||||||
fun fractionalKnapsack(wgt: IntArray, _val: IntArray, c: Int): Double {
|
fun fractionalKnapsack(wgt: IntArray, _val: IntArray, c: Int): Double {
|
||||||
// 建立物品串列,包含兩個屬性:重量、價值
|
// 建立物品串列,包含兩個屬性:重量、價值
|
||||||
|
@ -1587,77 +1587,6 @@ index = hash(key) % capacity
|
|||||||
var _val: String
|
var _val: String
|
||||||
)
|
)
|
||||||
|
|
||||||
/* 基於陣列實現的雜湊表 */
|
|
||||||
class ArrayHashMap {
|
|
||||||
// 初始化陣列,包含 100 個桶
|
|
||||||
private val buckets = arrayOfNulls<Pair>(100)
|
|
||||||
|
|
||||||
/* 雜湊函式 */
|
|
||||||
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._val
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 新增操作 */
|
|
||||||
fun put(key: Int, _val: String) {
|
|
||||||
val pair = Pair(key, _val)
|
|
||||||
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 = mutableListOf<Pair>()
|
|
||||||
for (pair in buckets) {
|
|
||||||
if (pair != null)
|
|
||||||
pairSet.add(pair)
|
|
||||||
}
|
|
||||||
return pairSet
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 獲取所有鍵 */
|
|
||||||
fun keySet(): MutableList<Int> {
|
|
||||||
val keySet = mutableListOf<Int>()
|
|
||||||
for (pair in buckets) {
|
|
||||||
if (pair != null)
|
|
||||||
keySet.add(pair.key)
|
|
||||||
}
|
|
||||||
return keySet
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 獲取所有值 */
|
|
||||||
fun valueSet(): MutableList<String> {
|
|
||||||
val valueSet = mutableListOf<String>()
|
|
||||||
for (pair in buckets) {
|
|
||||||
pair?.let { valueSet.add(it._val) }
|
|
||||||
}
|
|
||||||
return valueSet
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 列印雜湊表 */
|
|
||||||
fun print() {
|
|
||||||
for (kv in pairSet()) {
|
|
||||||
val key = kv.key
|
|
||||||
val _val = kv._val
|
|
||||||
println("${key} -> ${_val}")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 基於陣列實現的雜湊表 */
|
/* 基於陣列實現的雜湊表 */
|
||||||
class ArrayHashMap {
|
class ArrayHashMap {
|
||||||
// 初始化陣列,包含 100 個桶
|
// 初始化陣列,包含 100 個桶
|
||||||
|
@ -1372,15 +1372,23 @@ comments: true
|
|||||||
=== "Kotlin"
|
=== "Kotlin"
|
||||||
|
|
||||||
```kotlin title="quick_sort.kt"
|
```kotlin title="quick_sort.kt"
|
||||||
/* 快速排序 */
|
/* 快速排序(尾遞迴最佳化) */
|
||||||
fun quickSort(nums: IntArray, left: Int, right: Int) {
|
fun quickSortTailCall(nums: IntArray, left: Int, right: Int) {
|
||||||
// 子陣列長度為 1 時終止遞迴
|
// 子陣列長度為 1 時終止
|
||||||
if (left >= right) return
|
var l = left
|
||||||
// 哨兵劃分
|
var r = right
|
||||||
val pivot = partition(nums, left, right)
|
while (l < r) {
|
||||||
// 遞迴左子陣列、右子陣列
|
// 哨兵劃分操作
|
||||||
quickSort(nums, left, pivot - 1)
|
val pivot = partition(nums, l, r)
|
||||||
quickSort(nums, pivot + 1, right)
|
// 對兩個子陣列中較短的那個執行快速排序
|
||||||
|
if (pivot - l < r - pivot) {
|
||||||
|
quickSort(nums, l, pivot - 1) // 遞迴排序左子陣列
|
||||||
|
l = pivot + 1 // 剩餘未排序區間為 [pivot + 1, right]
|
||||||
|
} else {
|
||||||
|
quickSort(nums, pivot + 1, r) // 遞迴排序右子陣列
|
||||||
|
r = pivot - 1 // 剩餘未排序區間為 [left, pivot - 1]
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user