首页 > 其他分享 >逆序对

逆序对

时间:2023-07-13 20:12:00浏览次数:13  
标签:归并 int 复杂度 数组 ans 逆序

“逆序对”归并和线段树两种解法。这道经典题存在于任何一个算法题库中,故单独拿出分析讨论。

暴力

如果仅仅是用暴力、普通的分治方法。遇到数据量较大时内存不够。

归并

归并排序的时间复杂度

用归并法解此题之前先考虑一下,为何归并排序的时间复杂度是\(O(nlog_n)\)?

答:

首先是分裂,导致大小为n的数组散开形成\(log_n\)层,然后归并的亮点在于合并这些分裂开的数组:

两个原本有序的数组,合并的复杂度只需要\(O( n )\)啊!(当然,需要一个长度为n的辅助数组,空间换时间)

如果两个普通数组,合并时两两比较,复杂度就是\(O(n^2)\)。

分析到这里,再看看我之前写的归并法解此题,完全没领悟到归并的精髓啊!

最终代码

(就是归并排序多加一句对ans操作):

void merge(vector<int> &data,int i1,int j1,int i2,int j2){
    vector<int > tmp;
    int i=i1;
    while (i1<=j1 && i2<=j2){
        if(data[i1]<=data[i2]){
            tmp.push_back(data[i1++]);
        } else{
            tmp.push_back(data[i2++]);
            ans+=j1-i1+1;
        }
    }
    while (i1<=j1)
        tmp.push_back(data[i1++]);
    while (i2<=j2)
        tmp.push_back(data[i2++]);

    for(int x:tmp)
        data[i++]=x;
    
    return;
}

ans要声明成long long型,因为5e5大小的数组传进来,随便有几个逆序的ans就好大。

注意两个点:

  • 二分时要分割成(i,m,m+1,j)

    不要分成(i,m-1,m,j)这样(1,2)区间会被分成:

    (1,0,1,2)无限循环进入(1,2)

  • 合并时的条件是(i<=m && m+1<=j)

    要带上等于号!

    因为不能保证两个式子都是小于的。万一有一个等于就无法进入合并了。

    比如(1,2,3,3) 虽然(3,3)不用处理,但是(1,2)要处理啊。

线段树

标签:归并,int,复杂度,数组,ans,逆序
From: https://www.cnblogs.com/xuanshan/p/17551991.html

相关文章

  • HJ106 字符逆序
    1.题目读题HJ106 字符逆序  考查点 2.解法思路 代码逻辑 具体实现publicclassHJ106{publicstaticvoidmain(String[]args){Scannersc=newScanner(System.in);System.out.println(reverse(sc.nextLine()));}publicst......
  • Java字符串逆序的四种方法及比较
    Java中实现字符串逆序有以下几种常见的方法:方法一:使用StringBuffer或StringBuilder的reverse()方法。这是最简单和最直接的方法,只需要将String对象转换为StringBuffer或StringBuilder对象,然后调用它们的reverse()方法,就可以得到逆序的字符串。例如:publicclassStringReverse......
  • 求线性代数逆序数概念是啥意思?
    想要搞明白线性代数的“逆序”问题,不需要直接看生硬的概念,直接上手做几道题,循序渐进的就明白了——简单的说,只需要看下面这三篇笔记:你知道怎么判断一组数字的逆序数吗?你会使用逆序计算这个行列式吗?利用逆序求\(n\)阶行列式的值​......
  • 归并排序-逆序对的数量
    归并排序-逆序对的数量原理略代码#include<iostream>usingnamespacestd;constintN=1e5+10;typedefunsignedlonglongULL;ints[N],tmp[N];ULLmergeSort(intl,intr){if(l>=r)return0;intmid=(l+r)>>1;ULLres=merg......
  • LOJ#6077. 「2017 山东一轮集训 Day7」逆序对题解
    考虑朴素dp,令\(f_{i,j}\)为\(1\simi\)排列有\(j\)个逆序对的排列数。有转移方程:\[f_{i,j}=\sum_{k=0}^{i-1}f_{i-1,j-k}\]特殊地,我们定义\(j<0\)的\(f_{i,j}\)为\(0\)。定义\(\displaystyleF_i(x)=\sum_{j=0}^{\infty}f_{i,j}x^j\),有\(\displaystyleF_{i}(x)=......
  • 【剑指Offer】35、数组中的逆序对
    【剑指Offer】35、数组中的逆序对题目描述:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。即输出P%1000000007。输入描述:题目保证输入的数组中没有的相同的数......
  • 逆序数的讨论
    今天初中班主任问我一道题:想了想这就是逆序数的问题。逆序数为,一个从1到n的排列的逆序数个数。对于这道题,就是一个从1到8的逆序数为8的排列的个数。相关论文:https://kns.cnki.net/kcms2/article/abstract?v=3uoqIhG8C44YLTlOAiTRKgchrJ08w1e7_IFawAif0mzHoqs1uKxDSYgJRaQREx5nVao7p......
  • 算法学习(22): 逆序对与原序列
    逆序对与原序列在《组合数学》中有这么一个从逆序列构建一个排列的过程……而刚好有一场考试有考了类似的问题,于是在此总结一下。目录逆序对与原序列逆序列逆序个数带修改问题逆序列假定我们有序列\(P\)是\(\{1,2,\cdots,n\}\)的一个排列。如果\(i<j\)并且\(p_......
  • 逆序的三位数 (10 分) python版
    逆序的三位数(10分)python版程序每次读入一个正3位数,然后输出按位逆序的数字。注意:当输入的数字含有结尾的0时,输出不应带有前导的0。比如输入700,输出应该是7。输入格式:每个测试是一个3位的正整数。输出格式:输出按位逆序的数。输入样例:123输出样例:321'''Createdon2019年11......
  • 将一个数组逆序输出
    将一个数组逆序输出。#include<stdio.h>#defineN10intmain(){inta[N]={0,1,2,3,4,5,6,7,8,9};inti,t;printf("原数据为:\n");for(i=0;i<N;i++){printf("%d",a[i]);}for(i=0;i<N/2;i++){t=a[i];a[i]=a[......