- 博客(12)
- 收藏
- 关注
原创 位图、布隆过滤器
将数据存到vector中,相当于每个int值映射对应的32个值,⽐如第⼀个整形映射0-31对应的位,第⼆个整形映射32-63对应的位,后⾯的以此类推,那么来了⼀个整形值 x,i=x/32;经典topk问题,⽤堆解决,建小堆(堆顶是最小的数),循环和堆顶比较大于堆顶就和堆顶替换插入堆,最后堆中的100个数据就是最大的前100个。位图本质是⼀个直接定址法的哈希表,每个整型值映射⼀个bit位,位图提供控制这个bit的相关接⼝。不能支持删除,布隆过滤器检测的存在的值不准确,可能会删除与其哈希冲突的值的位。
2025-10-21 20:30:17
656
原创 C++11 Lambad和包装器(function bind)
包装器实例对象可以包装存储其他的可以调⽤对象,包括函数指针、仿函数、 lambda 、 bind 表达式等,存储的可调⽤对象被称为std::function 的⽬标。默认情况下, lambda 捕捉列表的按值捕获是被const修饰的,不能修改, mutable加在参数列表的后⾯可以取消其常量性,也就说使⽤该修饰符后,传值捕捉的对象就可以修改了,但是修改还是形参对象,不会影响实参。调用成员函数注意this指针参数,可以传递对象或对象的指针,本质是通过对象和成员函数的指针调用成员函数。
2025-10-16 19:50:47
858
原创 C++11类的新功能
C++11允许更好地控制要使⽤的默认函数,强制或禁止默认成员函数的生成。提供了在函数声明后加=delete和=default。原来C++类中,有6个默认成员函数:构造函数/析构函数/拷⻉构造函数/拷⻉赋值重载/取地址重载/const重载。成员变量声明时给缺省值是给初始化列表⽤的,如果没有显⽰在初始化列表初始化,就会在初始化列表⽤这个缺省值初始化。在函数声明后加override,在函数声明或类名后加final。
2025-10-12 20:59:49
237
原创 C++11的基础特性
C++11引入了多项重要特性:1)统一初始化语法{}支持所有类型初始化,可省略=;2)initializer_list类型处理初始化列表;3)auto/decltype实现类型自动推导;4)nullptr解决NULL的二义性问题;5)范围for循环简化集合遍历;6)STL新增容器和基于右值引用的高效接口。这些改进增强了类型安全性、代码简洁性和运行效率,使C++现代化程度显著提升。
2025-09-24 10:52:49
622
原创 C++11右值引用和移动语义
传递右值对象最终调用移动构造右值引用:标记可转移资源对象,并能将其修改完美转发<–万能引用<–引用折叠:实现左右值使用通用接口,传递过程中保持原值属性移动语义:如果参数包是已经构造的右值对象,调用移动构造转移其资源。(如果是左值对象,调用拷贝构造)。
2025-09-12 11:52:06
977
原创 unordered_map和unordered_set的封装
当一个桶遍历完后需要寻找下一个桶,这里需要增加一个成员变量(迭代器存储结点所在的哈希表),根据本结点的key查找到其在哪个桶,然后向后遍历找到下一个不为空的桶。第二个模板参数:k的类型,在下层从T中获取K的类型比较困难,所以直接传递K类型作为模板参数。迭代器中使用了哈希表,哈希表中也使用了迭代器,不管哪个放上面都会报错,这里需要前置声明。在定位结点在哪个桶时,需要访问哈希表的成员,需要成为哈希表的友元。上层传递T时将内部的K设置为const K从而使key不能修改。前置++返回&引用,并且修改自己。
2025-09-06 20:49:51
772
原创 哈希表的实现
当关键字的范围⽐较集中时,直接定址法就是⾮常简单⾼效的⽅法,⽐如⼀组关键字都在[0,99]之间,那么我们开⼀个100个数的数组,每个关键字的值直接就是存储位置的下标。假设哈希表中已经映射存储了N个值,哈希表的⼤⼩为M,那么负载因⼦=N/M,负载因⼦越⼤,哈希冲突的概率越⾼,空间利⽤率越⾼;负载因⼦越⼩,哈希冲突的概率越低,空间利⽤率越低;从发⽣冲突的位置开始,依次线性向后探测,直到寻找到下⼀个没有存储数据的位置为⽌,如果⾛到哈希表尾,则回绕到哈希表头的位置(通过%取模)。A 的⼩数部分,再向下取整。
2025-08-31 10:52:51
608
原创 map和set封装
本文分析了STL中红黑树(rb_tree)的实现原理及其在set和map中的应用。源码通过模板参数Value实现泛型设计,使同一红黑树结构既能支持set的key搜索,也能支持map的key/value搜索。文章详细介绍了迭代器实现的关键技术,包括operator++的中序遍历逻辑、const迭代器的常性传递机制,以及如何通过仿函数KeyOfT解决泛型场景下的key提取问题。在封装层面,展示了set和map如何通过外层封装红黑树来提供符合集合和映射语义的接口。最后给出了红黑树的完整实现代码,包括节点结构、迭代
2025-08-12 14:01:55
792
原创 红黑树的实现
红黑树是一种自平衡二叉搜索树,通过颜色约束(红黑结点交替)和旋转操作维持近似平衡。它具有以下特性:1)每个结点非红即黑;2)根结点为黑;3)无连续红结点;4)各路径黑结点数相同。这些规则确保最长路径不超过最短路径2倍,保证操作时间复杂度为O(logN)。插入时,新结点默认为红,若父结点为红则需调整(变色或旋转)。红黑树相比AVL树旋转次数更少,效率相近但实现更简单。代码实现包含枚举颜色类型、插入逻辑和四种旋转操作,确保插入后仍满足红黑树性质。
2025-08-04 22:42:16
950
原创 AVL树实现
插入时的旋转能确保旋转后的子树高度恢复到插入之前,所以会阻止向上影响平衡,只需旋转就能完成结构调整。subLR的左右子树旋转后分别成为subL的右子树和parent的左子树,因此影响它们的平衡因子。解决LL型parent的左子树的左子树插入导致失衡情况。解决RR型parent的右子树的右子树插入导致失衡情况。解决LR型parent的左子树的右子树插入导致失衡情况。解决RL型parent的左子树的右子树插入导致失衡情况。只有更新后parent的平衡因子为1/-1会继续更新。四种旋转方式分别解决四种失衡情况。
2025-07-29 13:21:49
731
原创 二叉搜索树
key/value二叉搜索树是在结点结构中加入一个遍历value与key相关,但不影响二叉搜索树的逻辑。二叉搜索树可以实现增删查,但不能实现改,因为改变某个结点的数据可能使二叉搜索树失效。根据二叉搜索树的性质进行遍历对比,直至找到目标结点或走到空结点结束。二叉搜索树又称二叉排序树,可以是空树,或是具有以下性质的二叉树。最优情况,二叉搜索树为完全二叉树,高度为log2 N。不能逐个遍历插入,因为插入顺序不同导致结构不同。最差情况,二叉搜索树退化为单支树,高度为N。后续学习二叉搜索树的变形优化。
2025-07-21 19:00:00
1472
原创 【排序算法】八大排序及优化策略
本文使用c语言实现以下八大排序(最后一种计数排序)快速排序利用树的思想高效实现,但在少部分情况(序列有序、有大量重复数据)下会退化(递归深度由logN变为接近N),可以采用三数取中法应对数组有序,采用三路划分法应对有大量重复数据,最大程度上防止快速排序退化。利用自省排序灵活结合三种排序算法,可以在大多数情况下保持快速排序的高效性能。时间复杂度:O(N*logN)空间复杂度:O(1)稳定性:不稳定。
2025-04-22 20:03:03
787
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅