为什么做关键词排名优化

网站关键词排名优化的优势

运用前沿seo思维帮助企业网站提升关键词排名是我们的特色

网站流量
网站流量

关键词排名带来源源不断的流量

品牌曝光度
品牌曝光度

网站seo优化可增加品牌曝光度

企业信誉度
企业信誉度

关键词优化可提升企业信誉度

企业营收
企业营收

网站优化具备长期盈利的能力

营销成本
营销成本

关键词seo可降低企业营销成本

优化服务
优化服务

网站优化服务目标灵活可调整

按天付费
按天付费

关键词排名按天按词按效果付费

主动营销
主动营销

关键词优化吸引客户自动上门

关键词排名优化的配置

关键词排名优化的流程

WEB PROCESS

  • 1
    在线联系客服

    提交企业网站

    评估seo关键词

  • 2
    关键词报价

    提交客户报价

    沟通优化费用

  • 3
    沟通优化意向

    沟通网站优化

    说明优化流程

  • 4
    合作预存费用

    签订优化合同

    预存优化费用

  • 5
    开启网站优化

    诊断分析网站

    关键词优化

  • 6
    关键词达标

    验收关键词

    关键词扣费

当前位置: 首页 > SEO快排软件 > 逐步优化,使快速排序性能提高5倍

逐步优化,使快速排序性能提高5倍

发布日期:2022-08-03 09:00:00

众所周知,快速排序是应用最广泛的排序方法。虽然快速排序算法的最坏情况时间复杂度可以达到o(n^2),但在实际应用中可以采用多种技术对最坏情况进行优化,使算法的时间复杂度接近o(nlogn)。

本文将通过各种常用的快速排序优化技术,对简单的快速排序算法进行逐步优化。由于空间有限,本文仅采用随机数数组进行测试,没有给出有序数组、反向数组和大量重复元素数组的优化。

这是一个测试函数,通过在测试函数中生成随机数数组,对数组进行排序并计算排序时间。

首先,我们实现了一个简单的快速排序算法,一个没有任何添加剂的纯快速排序算法。

测试结果:

我们可以看到,虽然它没有STL的排序快,但它至少是一个数量级。

众所周知,有序片段经常出现在用于排序的数组中。对于随机数数组,数组的大小越小,有序数组的概率越高。有两个前提对有序数组进行排序是无意义和耗时的;2、 检查阵列是否有序的时间复杂度很低,只需要O(n)。基于这两个前提,我们可以在对快速排序算法的每个递归子数组进行排序之前检查排序顺序,只有当排序顺序不对时,我们才能进行排序操作。

测试结果:

性能没有质的提高,因为测试使用随机数数组,而且有序子数组的概率很小,所以这种优化在这种情况下没有意义。但是在实际中,大多数数组通常都有有序的片段(甚至整个数组都是有序的),因此这种优化得到了很大的改进。

众所周知,快速排序算法的具体时间复杂度取决于递归数组的划分比。例如,如果我们在每次递归中把数组分成两个相等的部分,算法的时间复杂度将是的o(nlogn);如果在每一次递归中将数组分为大小1和大小n-1,则快速排序将退化为递归气泡排序,时间复杂度为O(n^2)。

测试结果:

一点改进,已经非常接近STL的分类了。由于测试是一个随机数数组,所以三位数中间法的效果并不明显,但有如此明显的改进却相当出乎意料。

接下来,我们需要使用一种更秽的方式来超越STL的排序——快速排序和直接插入排序的结合。众所周知,数组中的元素数量少,不利于快速排序。此时,快速排序仍处于堆栈递归、基准选择、分数组选择等过程中。仅仅对一些破碎的元素进行分类是不划算的。因此,我们需要用一种低代价的排序算法来代替快速排序递归末尾的小数组,以避免递归打开堆栈的代价。传统的方法是直接插入排序。虽然它的时间复杂度是O(n^2),但对于小型阵列仍然是可以接受的。

测试结果:

性能的改进是明显的,并且超过了STL的排序(虽然只有一点点)。

实际上,传统的快速排序优化也有各种各样的技巧,比如聚合重复元素、尾部递归优化(上面的代码编译器通常会自动进行尾部递归优化)等等,但是这些都是小的提升,很长一段时间都不能满足我。下一个

让我们比较一下多核操作和单核操作的STD::sort

快速排序使用分而治之的思想。它使用基准将阵列划分为两个子阵列进行排序,并将两个子阵列划分为两个子阵列。。。我们可以发现两个子数组的排序操作是独立的,互不影响,这给了我们多线程优化的机会。简而言之,两个独立的子数组按独立的线程排序,子数组按独立的线程排序。。。当CPU具有多核时,算法的性能将得到很大的提高。

值得注意的是,数组的分裂具有指数爆炸性,即1生成2,2生成4,如果没有限制,线程数将直接超过操作系统的限制。虽然这个限制可以修改,但是如果线程的数量远远超过CPU内核的数量,不仅不会有额外的加速,而且会浪费开发线程的时间和资源。

至于最合适的线程数,请进行测试

这里的递归深度意味着,如果没有超过递归深度,就没有大脑来打开子数组排序的线程。如果超过递归深度,将没有线程。

测试数据抖动很大。当可利用线程的递归深度为4~10时,该算法的性能。但由于不能保证每次快速排序递归时子数组分区相等,所以这里选择10。因为打开的线程越多,按每个线程排序的子数组中出现大数组的概率越小,排序时间越稳定,不易抖动。

我猜这个参数与硬件有关,与CPU核的数量有关。但我手头只有一台电脑,很难核实。但是,如果递归深度设置为10,也就是说,如果数组足够大,最多将打开1024个线程。至少对于大多数CPU来说,这个数字是非常高的。


「优帮云」全网搜索引擎优化服务商立即申请