杨氏矩阵
什么是杨氏矩阵
杨氏矩阵(Young tableau),又名杨表,是一种常用于表示论和舒伯特演算中的组合对象。
杨表是一种特殊的矩阵。它便于对称群和一般线性群的群表示和性质研究。杨表由剑桥大学数学家阿尔弗雷德·杨(Alfred Young)于 1900 年首次提出,于 1903 年被德国数学家弗罗贝尼乌斯(Ferdinand Georg Frobenius)应用于对称群的研究。
题目描述
我们在这里只对杨氏矩阵做简单的应用。
有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的,请编写程序在这样的矩阵中查找某个数字是否存在。
要求:时间复杂度小于O(N);
解题思路
我们先看几个简单的杨氏矩阵
通过我们仔细分析杨氏矩阵不难发现,杨氏矩阵的右上角和左下角的元素是有特点的,右上角的元素是一行中最大的,一列中最小的,左下角的元素是一行中最小的,一列中最大的。因此,如果我们需要在矩阵中查找某个元素,我们可以从这两个角入手。
例如我们从右上角开始查询
我们以第一个杨氏矩阵为例,假如我们要查询7,查询的规则就是,如果右上角的元素比要查询的元素小,我们就排除它所在的那一行,如果右上角的元素比要查询的元素大,我们就排除它所在的那一列。然后依然用右上角的元素和要查询的元素进行比较,直到找到或者找不到那个元素。
代码1如下:
#include <stdio.h>
int Find(int arr[][3], int r, int c, int k)
{
int x = 0;
int y = c - 1;
//这里是利用右上角的元素来查找
while (x < r && y >= 0)
{
if (arr[x][y] < k)
{
//这里排除一行
x++;
}
else if (arr[x][y] > k)
{
//这里排除一列
y--;
}
else
{
return 1;
}
}
return 0;
}
int main()
{
int arr[3][3] = { 1, 2, 3, 3, 4, 5, 6, 7, 9 };
int k = 7;
int ret = Find(arr, 3, 3, k);
if (ret == 1)
{
printf("找到了\n");
}
else
{
printf("找不到\n");
}
return 0;
}
运行结果如下:
- 值得注意的是,这个代码虽然满足了要求,但是它并不能够将找到的元素的位置打印出来,因此这个代码还需要改进。
代码1改进:
#include <stdio.h>
int Find(int arr[][3], int* px, int* py, int k)
{
int x = 0;
int y = *py - 1;
while (x < *px && y >= 0)
{
if (arr[x][y] < k)
{
x++;
}
else if (arr[x][y] > k)
{
y--;
}
else
{
//如果找到了,那就将main函数里的x和y进行修改
*px = x;
*py = y;
return 1;
}
}
return 0;
}
int main()
{
int arr[3][3] = { 1, 2, 3, 3, 4, 5, 6, 7, 9 };
int x = 3;//行数
int y = 3;//列数
int k = 7;//待查元素
//这里把行数和列数以地址的形式传给函数
int ret = Find(arr, &x, &y, k);
if (ret == 1)
{
printf("找到了\n");
printf("%d %d", x, y);
}
else
{
printf("找不到\n");
}
return 0;
}
运行结果如下:
- 这样的话,我们就完成了这个题目
感谢阅读,欢迎指正