很骚的二分(2)

活动 - AcWing

看到两篇好题解,我想进行说明。

归并排序是一种基于分治思想的排序算法,它将一个大的无序数组分成两个小的有序数组,然后再将这两个小的有序数组合并成一个大的有序数组。归并排序的时间复杂度是O(nlogn),空间复杂度是O(n),是一种稳定的排序算法。

归并排序的具体步骤如下:

如果数组长度小于等于1,直接返回该数组,不需要排序。
否则,将数组从中间分成两部分,分别对左右两部分递归地进行归并排序。
然后,将排好序的左右两部分合并成一个新的有序数组,方法是使用两个指针分别指向左右两部分的起始位置,比较指针所指向的元素的大小,将较小的元素放入新数组中,并移动指针到下一个位置,直到某一部分全部放入新数组中,再将另一部分剩余的元素依次放入新数组中。
最后,返回新数组作为结果。

本题满足归并排序的要求(即使元素大小关系不具传递性)

可以用std::stable_sort实现。

另一篇题解。

二分插入排序是一种改进的插入排序算法,它的基本思想是在插入第i个元素时,对前面的0~i-1元素进行折半,先跟他们中间的那个元素比,如果小,则对前半再进行折半,否则对后半进行折半,直到找到合适的位置插入第i个元素。这样可以减少比较次数,提高排序效率。

二分插入排序的平均时间复杂度是O (n log n),空间复杂度是O (1),排序方式是In-place,稳定性是稳定的。

二分插入排序的实现逻辑如下:

从第一个元素开始,该元素可以认为已经被排序
取出下一个元素,在已经排序的元素序列中二分查找到第一个比它大的数的位置
将新元素插入到该位置后
重复上述两步。

我只能说惊叹于二分的巧妙,//这里引用一下大佬题解

本题与一般排序有三个区别:
其一是交互式,你并不知道大小关系,只能通过调用compare接口询问;
其二是大小不具备传递性,比如a < b,b < c 并不能推出a < c;
其三是不能超过一万次询问,数据范围为1000,nlogn略小于一万,而CBA算法在最坏情况下的下界也就是nlogn。
对于其第二个性质仅仅导致答案不唯一,题目仅要求输出一种答案,所以可以忽视该条件。采用二分插入排序解决该问题,首先将第一个元素压入向量里,然后二分查找合适的位置r,将待插入元素插入到向量末尾,从后往前不断交换相邻的两个数直到待插入的元素到达指定位置。注意该二分算法的写法,循环退出时l比r大一,意味着r位置的必然小于待插入的元素,r+1及其之后的元素都大于待插入的元素。(比yxc大佬的代码更加简练了一点,因为我觉得mid=1+r+1>>2以致于代码最后还要多一次判断不容易理解,不如直接在循环里就判断好了,后面插入到末尾后只用不断前移,不用再进行判断了)。

作者:昂昂累世士
链接:https://www.acwing.com/solution/content/1009/
来源:AcWing

CBA算法是一种基于关联规则进行分类的算法,它利用了Apriori算法挖掘出的满足最小支持度和最小置信度的类关联规则(Class Association Rules),然后根据这些规则构建一个分类器。CBA算法可以看作是一种集成挖掘算法,它结合了关联规则挖掘和分类规则挖掘的优点,通常比传统的决策树分类算法如C4.5更准确。

CBA算法的主要步骤如下:

对数据集中的连续属性进行离散化,将所有属性值映射为正整数。
用Apriori算法生成所有满足最小支持度和最小置信度的类关联规则,即右部只包含类标签的规则。
从所有类关联规则中选择最优的规则作为可能规则(Possible Rules),即对于相同条件部分(左部)的规则,只保留置信度最高的一个。
从所有可能规则中选择最优的规则作为精确规则(Certain Rules),即满足最小置信度的规则。
根据精确规则构建一个分类器,按照置信度和支持度的降序对规则进行排序,对于每个测试样本,按照顺序匹配规则,直到找到一个符合条件部分的规则,然后将其划分为该规则的类标签。如果没有找到匹配的规则,则使用默认类别,即训练集中出现次数最多的类别。

std::stable_sort是一个C++标准库中的函数,它用于对一个范围内的元素进行排序。它和std::sort的区别是,std::stable_sort可以保证相等的元素在排序后保持原来的相对顺序,而std::sort则不一定。

std::stable_sort的语法格式有两种:

template< class RandomIt > void stable_sort( RandomIt first, RandomIt last );
template< class RandomIt, class Compare > void stable_sort( RandomIt first, RandomIt last, Compare comp );
其中,first和last是随机访问迭代器,它们指定了要排序的范围。comp是一个可选的比较函数或者函数对象,它用于自定义排序规则。如果不指定comp,那么默认使用operator<进行比较。

std::stable_sort的时间复杂度是O(nlogn),空间复杂度是O(n),其中n是要排序的元素个数。

std::stable_sort的实现原理是基于归并排序算法,它先将要排序的范围分成若干个小段,然后对每个小段进行插入排序,再将这些有序的小段合并成一个大的有序范围。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值