行列式(二):全排列与逆序数

由n阶行列式的定义可知,求行列式需要首先求解一个序列的全排列和逆序数



1.全排列

从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列。

  • 算法原理

  1.假设有一个序列{1,2,3,4,5},首先排列第一个元素,共有5种情况

  {1,*,*,*,*}

  {2,*,*,*,*}

  {3,*,*,*,*}

  {4,*,*,*,*}

  {5,*,*,*,*}

  2.单独分析1.中的第一种情况,排列第二个元素,共有四种情况

  {1,2,*,*,*}

  {1,3,*,*,*}

  {1,4,*,*,*}

  {1,5,*,*,*}

  3.以此推类,依次排列第三,四和五个元素。即可求得序列的全排列

  • VB.NET自定义方法

  1.方法名:GetFullPerm(ByVal NumArray() As Integer, ByVal LeftIndex As Integer, ByRef Result As List(Of Array))

2.功能:传入一个一维数组和List (Of Array),求得该一维数组的全排列

3.参数:

  NumArray:一维数组,要求全排列的序列

   LeftNum:当前求解的索引,调用方法时传入0即可

     Result:List (Of Array),用于保存全排列的结果

    Private Sub GetFullPerm(ByVal NumArray() As Integer, ByVal LeftIndex As Integer, ByRef Result As List(Of Array))
        Dim temp As Integer
        If LeftIndex = NumArray.Length - 1 Then
            Dim tempArray(NumArray.Length - 1) As Integer
            NumArray.CopyTo(tempArray, 0)
            Result.Add(tempArray)
        Else
            temp = NumArray(LeftIndex)
            For i = LeftIndex To NumArray.Length - 1
                NumArray(LeftIndex) = NumArray(i)
                NumArray(i) = temp ‘对换
                GetFullPerm(NumArray, LeftIndex + 1, Result)
                NumArray(i) = NumArray(LeftIndex)
                NumArray(LeftIndex) = temp ‘还原对换
            Next
        End If
    End Sub


2.逆序数

在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序。一个排列中逆序的总数就称为这个排列的逆序数

  • 算法原理

  1.假设有一个序列{3,1,2,4,5},首先求第一个元素的逆序数,T1=0

2.依次求解第二,三,四和五位置的元素的逆序数,T2=1,T3=1,T4=0,T5=0

  3.求得各位置元素逆序数的总和,T=T1+T2+T3+T4+T5=2

  • VB.NET自定义函数

  1.函数名:GetInverseNum(ByVal NumArray() As Integer)

2.功能:传入一个一维数组,求得该一维数组序列的逆序数

3.参数:

  NumArray:一维数组,要求逆序数的序列

    Private Function GetInverseNum(ByVal NumArray() As Integer)
        Dim Num As Integer = 0
        For i = 0 To NumArray.Length - 1
            For j = i To NumArray.Length - 1
                If NumArray(i) > NumArray(j) Then Num += 1
            Next
        Next
        Return Num
    End Function
时间: 2024-10-07 22:52:45

行列式(二):全排列与逆序数的相关文章

拼图游戏中逆序数的实现的三种方式

一.定义 在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序.一个排列中逆序的总数就称为这个排列的逆序数.如2431中,21,43,41,31是逆序,逆序数是4. 二.计算方法 逆序数的计算方法主要有直接计算,归并和树状数组三种,下面将一一介绍. 2.1 直接计算 即根据定义用枚举的方法求逆序数.对于数列中的每一个数a[i],遍历数列中的数a[j] (其中j < i),若a[i] < a[j],则逆序数加1,这样就能统计出该数列的逆序数总和. 该方

《程序设计与算法(二)算法基础》《第五周 分治》求排列的逆序数 11

011:求排列的逆序数 查看 提交 统计 提问 总时间限制:  1000ms 内存限制:  65536kB 描述 在Internet上的搜索引擎经常需要对信息进行比较,比如可以通过某个人对一些事物的排名来估计他(或她)对各种不同信息的兴趣,从而实现个性化的服务. 对于不同的排名结果可以用逆序来评价它们之间的差异.考虑1,2,…,n的排列i1,i2,…,in,如果其中存在j,k,满足 j < k 且 ij > ik, 那么就称(ij,ik)是这个排列的一个逆序. 一个排列含有逆序的个数称为这个排

归并算法经典应用——求解逆序数

本文始发于个人公众号:TechFlow,原创不易,求个关注 在之前介绍线性代数行列式计算公式的时候,我们曾经介绍过逆序数:我们在列举出行列式的每一项之后,需要通过逆序数来确定这一项符号的正负性.如果有忘记的同学可以回到之前的文章当中复习一下: 线性代数行列式 如果忘记呢,问题也不大,这个概念比较简单,我想大家很快就能都搞清楚. 今天的这一篇文章,我想和大家聊聊逆序数的算法,也是一道非常经典的算法题,经常在各大公司的面试题当中出现. 我们先来回顾一下逆序数的定义,所谓逆序数指的是数组当中究竟存在多

n阶行列式的全排列求解(Java)

上一个随笔,我介绍了全排列的递归求解,其中还有排列的逆序数等代码,这次我来介绍如何使用全排列计算行列式的值. 使用全排列求行列式的值,简单的描述就是: 对这个行列式每一行选取一个数,这些数处于行列式的不同的列,将这些数相乘,结果记为A_1 将这些数的列标按行标从上到下的顺序排列,如果这个排列的逆序数为偶数,A_1加个正号+A_1,否则加个负号-A_1 由排列组合知识我们知道我们一共能从行列式中取出n!种情况.他们的和就是行列式的值 (刚开始用博客园,没找到插入latex的地方,我就截个图了...

归并排序_逆序数

归并排序求逆序数 在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序.一个排列中逆序的总数就称为这个排列的逆序数.一个排列中所有逆序总数叫做这个排列的逆序数.也就是说,对于n个不同的元素,先规定各元素之间有一个标准次序(例如n个 不同的自然数,可规定从小到大为标准次序),于是在这n个元素的任一排列中,当某两个元素的先后次序与标准次序不同时,就说有1个逆序.一个排列中所有逆序总数叫做这个排列的逆序数. 1 #include<cstdio> 2 #in

HDU 1394 Minimum Inversion Number 【逆序数】

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 题目大意:给一个n,然后给出一组0~n-1的序列,求这个序列的逆序数,以及交换之后的逆序数中的最小值.交换规则是: a1, a2, ..., an-1, an (where m = 0 - the initial seqence) a2, a3, ..., an, a1 (where m = 1) a3, a4, ..., an, a1, a2 (where m = 2) ... an, a1

逆序对问题---求逆序数

逆序数:在一个排列中,如果一对数的前后位置与大小顺序相反, 即前面的数大于后面的数,那么它们就称为一个逆序. 一个排列中逆序的总数就称为这个排列的逆序数.逆序数为偶数的排列称为偶排列:逆序数为奇数的排列称为奇排列. { 设 A 为一个有 n 个数字的有序集 (n>1),其中所有数字各不相同. 如果存在正整数 i, j 使得 1 ≤ i < j ≤ n 而且 A[i] > A[j],则 <A[i], A[j]> 这一个有序对称为 A 的一个逆序对,也称作逆序.逆序对的数量称作逆

hdu 5147 Sequence II (树状数组 求逆序数)

题目链接 Sequence II Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 331    Accepted Submission(s): 151 Problem Description Long long ago, there is a sequence A with length n. All numbers in this se

poj 2274 The Race(逆序数+线段树)

The Race Time Limit: 15000MS   Memory Limit: 65536K Total Submissions: 3237   Accepted: 664 Case Time Limit: 3000MS Description During the Annual Interstellar Competition for Tuned Spaceships, N spaceships will be competing. Each spaceship i is tuned