前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >逆序数对(inversion)个数统计 python解法与时间复杂度推导

逆序数对(inversion)个数统计 python解法与时间复杂度推导

作者头像
大鹅
发布2021-06-16 17:11:32
1.7K0
发布2021-06-16 17:11:32
举报
文章被收录于专栏:大鹅专栏:大数据到机器学习

问题描述

Let

x_1, x_2, . . . , x_n

be a list of n distinct input integers. We call the pair (i, j) an inversion if i < j and

x_i > x_j

. Give a divide-and-conquer algorithm that reports in

O(n log n)

time the total number of inversions in the input list. Explain why your algorithm works and why it runs in

O(n log n)

time.

设A[1..n]是一个包含n个不同数的数组。如果在i < j的情况下,有A[i] > A[j],则(i, j)就称为A中的一个逆序对(inversion)。给出一个算法,它能用O(n log n)的最坏运行时间,确定n个元素的任何排列中逆序对的数目。

思路

合并数列(1,3,5)与(2,4)的时候:

  1. 先取出前面数列中的1。
  2. 取出后面数列中的2,此时2和前面的3,5都可以组成逆序数对即(3, 2),(5, 2)
  3. 取出前面数列中的3。
  4. 取出后面数列中的4,同理,4和前面数列中的5可以组成一个逆序数对。

这样就完成了逆序数对的统计,归并排序的时间复杂度是O(N * LogN),因此这种从归并排序到数列的逆序数对的解法的时间复杂度同样是O(N * LogN)

python解法

代码语言:javascript
复制
def merge_sort(data):
    if len(data) <= 1:
        return data
    index = len(data) // 2
    lst1 = data[:index]
    lst2 = data[index:]
    left = merge_sort(lst1)
    right = merge_sort(lst2)
    return merge(left, right)


def merge(lst1, lst2):
    """to Merge two list together"""
    list = []
    while len(lst1) > 0 and len(lst2) > 0:
        data1 = lst1[0]
        data2 = lst2[0]
        if data1 <= data2:
            list.append(lst1.pop(0))
        else:
            global num
            num = num + 1
            list.append(lst2.pop(0))
    if len(lst1) > 0:
        list.extend(lst1)
    else:
        list.extend(lst2)
    return list


num = 0
arr = [1, 3, 5, 2, 4]
print(merge_sort(arr))
print(num)

输出结果为

[1, 2, 3, 4, 5] 3

时间复杂度

T[n] = 2T[n/2] + O(n)
T[n]=2(2T[n/4]+O(n/2))=2^2T[n/2^2]+O(2n)

T[n]=nT[1]+O(nlogn)

所以时间复杂度为

O(n log n)
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018/03/04 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题描述
  • 思路
  • python解法
  • 时间复杂度
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档