一维数组映射为上三角阵实现

将一个一维数组A的下标映射为上三角阵的实现方式如下:

import math
import sys

def calculate_coordinates(n, k):
    i = n - 1 - math.floor(math.sqrt(-8*k + 4*n*(n+1)-7)/2.0 - 0.5)
    j = k + math.floor(i - n*(n+1)/2 + (n-i)*(n-i+1)/2)
    return i, j

def cal(n, k):
    matrix = [['x' for _ in range(n)] for _ in range(n)]
    for t in range(n*(n+1)//2):
        i, j = calculate_coordinates(n, t)
        matrix[i][j] = str(t)
    i_k, j_k = calculate_coordinates(n, k)
    matrix[i_k][j_k] = '[' + matrix[i_k][j_k] + ']'
    for row in matrix:
        print(' '.join(['{:>4}'.format(item) for item in row]))
        
    
def triu_indices(n):
    indices = [(i, j) for i in range(n) for j in range(i, n)]
    return indices

def cal2(n, k):
    indices = triu_indices(n)

    matrix = [['x' for _ in range(n)] for _ in range(n)]
    for t in range(n*(n+1)//2):
        i, j = (indices[t][0], indices[t][1])
        matrix[i][j] = str(t)
    i_k, j_k = (indices[k][0], indices[k][1])
    matrix[i_k][j_k] = '[' + matrix[i_k][j_k] + ']'
    for row in matrix:
        print(' '.join(['{:>4}'.format(item) for item in row]))

if __name__ == "__main__":
    n = int(sys.argv[1])
    k = int(sys.argv[2])
    cal(n, k)

运行以下命令,即可生成一个上三角阵,其中5表示生成上三角阵的维度为5, 3表示将数组A的下标3对应的上三角阵的坐标标记出来,用于验证准确性。另外,第二个参数(3)不能大于n(n+1)/2,其中n为上三角阵的维度。

python linear.py 5 3

   0    1    2    [3]    4
   x    5    6    7      8
   x    x     9   10   11
   x    x     x   12   13
   x    x     x    x    14

以上是包含对角线的上三角阵的生成方式。如果不包含对角线,则其生成方式如下: 

import math
import sys

def calculate_coordinates(n, k):
    i = n - 2 - math.floor(math.sqrt(-8*k + 4*n*(n-1)-7)/2.0 - 0.5)
    j = k + math.floor(i + 1 - n*(n-1)/2 + (n-i)*(n-i-1)/2)
    return i, j

def cal(n, k):
    matrix = [['x' for _ in range(n)] for _ in range(n)]
    for t in range(n*(n-1)//2):
        i, j = calculate_coordinates(n, t)
        matrix[i][j] = str(t)
    i_k, j_k = calculate_coordinates(n, k)
    matrix[i_k][j_k] = '[' + matrix[i_k][j_k] + ']'
    for row in matrix:
        print(' '.join(['{:>4}'.format(item) for item in row]))
        
def triu_indices(n):
    indices = [(i, j) for i in range(n) for j in range(i+1, n)]
    return indices
        
def cal2(n, k):
    indices = triu_indices(n)

    matrix = [['x' for _ in range(n)] for _ in range(n)]
    for t in range(n*(n-1)//2):
        i, j = (indices[t][0], indices[t][1])
        matrix[i][j] = str(t)
    i_k, j_k = (indices[k][0], indices[k][1])
    matrix[i_k][j_k] = '[' + matrix[i_k][j_k] + ']'
    for row in matrix:
        print(' '.join(['{:>4}'.format(item) for item in row]))

if __name__ == "__main__":
    n = int(sys.argv[1])
    k = int(sys.argv[2])
    cal2(n, k)

运行同样的命令生成:

   x    0    1    2  [3]
   x    x    4    5    6
   x    x    x    7    8
   x    x    x    x    9
   x    x    x    x    x
 

  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

space01

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值