hash vs RBTree

数据结构:最小堆/哈希表 /二叉树 /平衡二叉树/红黑树的意义(什么情况下使用)


接触堆数据结构是在排序里面讲的,空间复杂度O(1),时间复杂度O(NlogN),但是在实践中还是不如快速排序(好像快速排序可以更好的利用硬件特 性)。堆的意义就在于:最快的找到最大/最小值,在堆结构中插入一个值重新构造堆结构,取走最大/最下值后重新构造堆结构 其时间复杂度为O(logN),而其他方法最少为O(N).堆实践中用途不在于排序,其主要用在调度算法中,比如优先级调度,每次取优先级最高的,时间驱 动,取时间最小/等待最长的 等等 ,分为最大堆/最小堆。
  哈希表主要可以在O(1)时间内对查找对象定位,但是事实上,如果输入集合不确定 的情况下,可能出现大量的冲突,虽然有很多好的哈希函数,但是随着随机输入,大量冲突还是不可避免,可能出现最差情况。所以,哈希表如果用在输入集合确定 (即以后只会做查询操作)的情况下,选择合适的函数函数和解决冲突的方法(perfect hash)可以在O(1)时间内完成查找(有证明,看不懂)。
  二叉树支持动态的插入和查找,保证操作在O(height)时间,这就是完成了哈希表不便完成的工作,动态性。但是二叉树有可能出现worst-case,如果输入序列已经排序,则时间复杂度为O(N)
  平衡二叉树/红黑树就是为了将查找的时间复杂度保证在O(logN)范围内。
  所以如果输入结合确定,所需要的就是查询,则可以考虑使用哈希表,如果输入集合不确定,则考虑使用平衡二叉树/红黑树,保证达到最大效率

什么时候用map,什么时候用hash table?

* Hash tables have faster average lookup and insertion time (O(1)), while balanced binary trees have faster worst-case lookup and insertion time (O(log n) instead of O(n)). These make trees more useful in real-time and interactive systems, and in high-security systems where untrusted users may deliberately supply information that triggers worst-case performance in a hash table. Hash tables are more useful for very large arrays, where O(1) performance is important.
* Hash tables have more compact storage for small value types, especially when the values are bits.
* There are simple persistent versions of balanced binary trees, which are especially prominent in functional languages.
* Building a hash table requires a good hash function for the key type, which can be difficult to write, while balanced binary trees require a total ordering on the keys.
* Balanced binary trees preserve ordering -- allowing one to efficiently iterate over the keys in order or to efficiently locate an association whose key is nearest to a given value. Hash tables do not preserve ordering and therefore cannot perform these operations as efficiently.
* Balanced binary trees can be easily adapted to efficiently assign a single value to a large ordered range of keys, or to count the number of keys in an ordered range.

### `CONFIG_RUNTIME_TESTING_MENU=y` 这是一个 Linux 内核配置选项,用于启用 **运行时测试菜单(Runtime Testing Menu)**,它是一个用于内核开发者进行功能验证和调试的测试框架集合。 --- ### 🔧 作用说明 - 启用后,会在内核中添加一个调试菜单,允许通过 `/sys/kernel/debug/provoke-crash/` 接口触发各种内核行为(如崩溃、死锁、内存泄漏等),用于测试内核健壮性和调试机制; - 主要用于 **内核开发、测试和调试阶段**; - 该菜单本身不运行实际测试,但提供了访问各种测试模块的入口; - 通常不会在生产环境中启用。 --- ### 📌 子项配置说明(已禁用) 以下配置项均为运行时测试菜单下的具体测试模块,当前均未启用: | 配置项 | 用途说明 | |--------|----------| | `CONFIG_LKDTM` | Linux Kernel Dump Test Module,用于触发各种崩溃行为 | | `CONFIG_TEST_LIST_SORT` | 测试内核链表排序算法 | | `CONFIG_TEST_MIN_HEAP` | 测试最小堆实现 | | `CONFIG_TEST_SORT` | 测试排序函数 | | `CONFIG_BACKTRACE_SELF_TEST` | 测试堆栈回溯功能 | | `CONFIG_RBTREE_TEST` | 测试红黑树实现 | | `CONFIG_REED_SOLOMON_TEST` | 测试里德-所罗门编码算法 | | `CONFIG_INTERVAL_TREE_TEST` | 测试区间树实现 | | `CONFIG_PERCPU_TEST` | 测试 per-CPU 变量 | | `CONFIG_ATOMIC64_SELFTEST` | 测试 64 位原子操作 | | `CONFIG_TEST_HEXDUMP` | 测试 hex 数据转储功能 | | `CONFIG_TEST_STRING_HELPERS` | 测试字符串辅助函数 | | `CONFIG_TEST_STRSCPY` | 测试 `strscpy` 函数 | | `CONFIG_TEST_KSTRTOX` | 测试字符串转数值函数 | | `CONFIG_TEST_PRINTF` | 测试内核 `printf` 实现 | | `CONFIG_TEST_BITMAP` | 测试位图操作 | | `CONFIG_TEST_UUID` | 测试 UUID 生成和解析 | | `CONFIG_TEST_XARRAY` | 测试 XArray 数据结构 | | `CONFIG_TEST_OVERFLOW` | 测试整数溢出检测 | | `CONFIG_TEST_RHASHTABLE` | 测试 rhashtable 实现 | | `CONFIG_TEST_HASH` | 测试通用哈希函数 | | `CONFIG_TEST_IDA` | 测试 ID 分配器 | | `CONFIG_TEST_LKM` | 测试加载和卸载 LKM(Loadable Kernel Module) | | `CONFIG_TEST_BITOPS` | 测试位操作函数 | | `CONFIG_TEST_VMALLOC` | 测试 vmalloc 内存分配 | | `CONFIG_TEST_USER_COPY` | 测试用户空间内核空间的数据拷贝 | | `CONFIG_TEST_BPF` | 测试 eBPF 程序加载和执行 | | `CONFIG_TEST_BLACKHOLE_DEV` | 测试黑洞网络设备 | | `CONFIG_FIND_BIT_BENCHMARK` | 测试 bit 操作性能 | | `CONFIG_TEST_FIRMWARE` | 测试固件加载机制 | | `CONFIG_TEST_SYSCTL` | 测试 sysctl 接口 | | `CONFIG_TEST_UDELAY` | 测试微秒级延迟函数 | | `CONFIG_TEST_STATIC_KEYS` | 测试静态密钥机制 | | `CONFIG_TEST_MEMCAT_P` | 测试 `memcat` 类函数 | | `CONFIG_TEST_STACKINIT` | 测试栈初始化检测 | | `CONFIG_TEST_MEMINIT` | 测试内存初始化检测 | | `CONFIG_TEST_FREE_PAGES` | 测试页面释放机制 | --- ### ✅ 适用场景 | 场景 | 是否建议启用 | |------|--------------| | 内核开发调试 | ✅ | | 自动化测试环境 | ✅ | | 构建生产环境内核 | ❌ | | 构建嵌入式最小化系统 | ❌ | | 内核模块健壮性测试 | ✅ | --- ### 🧩 示例:触发内核测试 假设你启用了 `CONFIG_LKDTM`,可以通过以下方式触发测试: ```bash echo BUG > /sys/kernel/debug/provoke-crash/Crash ``` --- ##
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值