逆序数法计算N阶行列式的值

--以4阶为例
--详情请参考https://blog.csdn.net/weixin_46664967/article/details/113621821
DECLARE @n INT=4
DECLARE @i INT =1
DECLARE @r  VARCHAR(4000)
DECLARE @lx INT
DECLARE @v INT  
DECLARE @rst INT  =0

--建数组 
CREATE TABLE  #tmp
(
 i INT,
 j INT,
 v INT    
)

INSERT INTO #tmp VALUES(1,1,3),(1,2,1),(1,3,1),(1,4,1)
INSERT INTO #tmp VALUES(2,1,1),(2,2,3),(2,3,1),(2,4,1)
INSERT INTO #tmp VALUES(3,1,1),(3,2,1),(3,3,3),(3,4,1)
INSERT INTO #tmp VALUES(4,1,1),(4,2,1),(4,3,1),(4,4,3) 
 
--全排列
CREATE TABLE #rst 
(
	i INT,
	n INT,
	r VARCHAR(4000) 
)
INSERT INTO #rst
SELECT 1,number,CONVERT(VARCHAR(4000),number) AS r  
FROM master..spt_values WHERE type='p' AND number BETWEEN 1 AND @n
 
WHILE @i<=@n
BEGIN
	INSERT INTO #rst
	SELECT @i+1,number,a.r+','+CONVERT(VARCHAR(4000),b.number)  FROM #rst a 
	CROSS JOIN 
	(
		SELECT CONVERT(VARCHAR(10),number) AS number
		FROM master..spt_values WHERE type='p' AND number BETWEEN 1 AND @n
	) b  
	WHERE  CHARINDEX(b.number,a.r)=0 AND i=@i
	
	SET @i=@i+1
END 

SELECT IDENTITY(INT,1,1) AS i, r INTO #rst2  
FROM #rst WHERE i=@n 
SET @n=@@ROWCOUNT

--计算
SET @i=1
WHILE @i<=@n
BEGIN 
	SELECT @r=r FROM #rst2 WHERE i=@i

	SET @lx=0
	--逆序数
	;WITH  ct
	AS
	(
		SELECT *  from  dbo.f_Split(@r,',')
	)  
	SELECT @lx=COUNT(1)  FROM ct m,ct n
	WHERE m.id>n.id 
	AND m.value<n.value
	
	--累计
	SET @v=1
	SELECT @v=@v*v  FROM #tmp a INNER JOIN   dbo.f_Split(@r,',') b ON a.i= b.id AND a.j=b.value
	SET @rst =@rst+POWER(-1,@lx)* @v
 
	SET @i=@i+1
END 

SELECT @rst 

DROP TABLE #rst
DROP TABLE #rst2
DROP TABLE #tmp

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值