杨氏矩阵定义及其查找的实现C++

  先介绍一下这个数据结构的定义,Young Tableau有一个m*n的矩阵,然后有一数组 a[k], 其中 k<=m*n ,然后把a[k]中的数填入 m*n 的矩阵中,填充规则为:

1.  每一行每一列都严格单调递增(有其他的版本是递减,其原理相同)。

2.  如果将a[k]中的数填完后,矩阵中仍有空间,则填入 

  举例:

  这里主要给出杨氏矩阵的定义和查找

  方法:理由每一列,没一行都是递增的,我们从左上角开始查找,不断的缩小矩阵的大小,最后只剩一1*1的矩阵。

  C++代码:

  1 #pragma once
  2 //YoungTableau.h
  3 #include <iostream>
  4 class YoungTableau
  5 {
  6 public:
  7         YoungTableau(int rows, int columns,int**newTable)
  8         {
  9             x = rows;        //行数
 10             y = columns;    //列数
 11
 12             if (newTable!=NULL)
 13             {
 14                 table = (int **)((new int[rows*columns]));
 15                 for (int i = 0; i < rows*columns; i++)
 16
 17                 {
 18                     ((int*)table)[i] = ((int*)newTable)[i];
 19                     std::cout << ((int*)table)[i] << std::endl;
 20                 }
 21
 22             }
 23
 24         };
 25         ~YoungTableau();
 26 private:int x;
 27 private:int y;
 28 private: int **table;
 29
 30 public:
 31     void print_matrix(void)
 32     {
 33         std::cout <<x<<y << std::endl;
 34         if (table != NULL)
 35         {
 36             for (int i = 0; i < x; i++)
 37                 for (int j = 0; j < y; j++)
 38                     std::cout << ((int*)table)[i*y+j]<<std:: endl;
 39         }
 40     }
 41 public:int get_element(int rows, int columns,int*res)
 42 {
 43     if (res != NULL)
 44     {
 45         if (rows>=this->x || columns >= this->y)
 46         {
 47             *res = 0;
 48             return -1;
 49         }
 50         else
 51         {
 52             *res = ((int*)table)[rows*y + columns];
 53             return 0;
 54         }
 55     }
 56     else
 57     {
 58         *res = 0;
 59         return -2;
 60     }
 61 }
 62 private:bool IsEqualAtLeftTop(int data, int rownum, int columnnum)
 63 {
 64     if (this->table != NULL)
 65     {
 66         if (rownum >= x || columnnum >= y || (rownum == x - 1 && columnnum == 0 && data != ((int*)this->table)[rownum*y + columnnum]))
 67         {
 68             std::cout << "illgal column" << std::endl;
 69             return false;
 70         }
 71         else if (data == ((int*)this->table)[rownum*y + columnnum])
 72         {
 73             return true;
 74         }
 75         else if (data < ((int*)this->table)[rownum*y + columnnum])
 76         {
 77             std::cout << "next column"<< std::endl;
 78             if (columnnum == 0)
 79                 return false;
 80             else
 81                 return IsEqualAtLeftTop(data, rownum, columnnum - 1);
 82         }
 83         else
 84         {
 85             std::cout << "next row" << std::endl;
 86             if (rownum == x-1)
 87                 return false;
 88             else
 89                 return IsEqualAtLeftTop(data, rownum+1, columnnum);
 90         }
 91
 92     }
 93     else
 94     {
 95         return false;
 96     }
 97 }
 98 public:bool IsExistence(int data)
 99 {
100     if (this->table != NULL)
101     {
102         /*for (int i = 0; i < x; i++)
103             for (int j = 0; j < y; j++)
104             {
105             if (data == ((int*)table)[i*y + j])
106                 return true;
107             }
108         return false;*/
109         return IsEqualAtLeftTop(data, 0, y - 1);
110     }
111     return false;
112 }
113
114 };
 1 // Young_Tableau.cpp : 定义控制台应用程序的入口点。
 2 //
 3
 4 #include "stdafx.h"
 5 #include "YoungTableau.h"
 6
 7 int _tmain(int argc, _TCHAR* argv[])
 8 {
 9     int tmp_table[3][3] =
10     {
11         {1, 3, 4 },
12         {2, 3, 6},
13         {5, 8, 10}
14     };
15     YoungTableau matrix(3,3,(int**)tmp_table);
16     matrix.print_matrix();
17     int tmp = 0;
18     matrix.get_element(2,2,&tmp);
19     std::cout << tmp << std::endl;
20
21     if (matrix.IsExistence(5)==true)
22         std::cout <<"true"<< std::endl;
23     else std::cout << "false" << std::endl;
24     while (1);
25     return 0;
26 }
 1 #include "stdafx.h"
 2 #include "YoungTableau.h"
 3 // YoungTableau.cpp : 类的实现
 4 //
 5
 6
 7 YoungTableau::~YoungTableau()
 8 {
 9
10 }
时间: 2024-08-11 09:57:11

杨氏矩阵定义及其查找的实现C++的相关文章

杨氏矩阵中的查找

杨氏矩阵 杨氏矩阵中,每行元素是递增的,每列元素也是递增的.即a[i][j]<a[i+1][j]且a[i][j]<a[i][j+1].要在这样的矩阵中查找某个数值元素的位置,复杂度可以达到o(m+n),其中n为矩阵行长度,m为矩阵列长度. 开始我想的是每一行使用二分查找,时间复杂度为O(n * logm) 看到网上使用的定位法,时间复杂度为O(n + m) 首先定位到第一行最后一个元素,如果要查找的数等于这个元素,直接返回true.如果array[i][j]>num,向前寻找,如果arr

二维数组中的查找,杨氏矩阵

题目: 在一个二维数组中,每行都按照从左到右的递增的顺序排序.每列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个数组和一个数,判断数组中是否包含这个数. 例如: 二维数组 1 2 3 4 5 6 7 8 9 查找数字7. 题目分析: 算法一: 杨氏矩阵中的查找,可以看做是在二维数组中查找,定义一个二维数组,根据数组的基本特点,可以从数组中第一个元素逐行进行遍历,若数组的某个元素与所要找的数字相等,则能够找到这个数字.如果遍历完整个数组,都没有与之相等的元素,则找不到这个数字. 下面

二位数组中的查找——杨氏矩阵

------------------------------------------------------------------------------------------------- "杨氏矩阵":即数组元素从左向右依次递增,从上到下依次递增.要想在该数组中查找数,首 先该数组得满足"杨氏矩阵"的特点.为了方便理解我们可以将一个二位数组看作是一个矩阵,假设i 为行,j为列,数组为str,那么只要满足(str[i][j]<str[i][j+1] &a

杨氏矩阵中查找元素

在杨氏矩阵中查找一个元素是否存在 杨氏矩阵即每一行均以递增顺序排列,每列从上到下也为递增顺序 方法一:数组 #include<stdio.h> #include<stdlib.h> #define COLS 3 #define ROWS 3 //要查找只要在找到右上角的元素和输入元素进行比较.如果右上角元素大,即可排除其他行,若小 //,则可排除本行,继续循环,用输入元素和右上角的元素进行比较 int find(int arr[][COLS], int rows, int cols

【c语言】二维数组中的查找,杨氏矩阵在一个二维数组中,每行都依照从左到右的递增的顺序排序,输入这种一个数组和一个数,推断数组中是否包括这个数

// 二维数组中的查找,杨氏矩阵在一个二维数组中.每行都依照从左到右的递增的顺序排序. // 每列都依照从上到下递增的顺序排序.请完毕一个函数,输入这种一个数组和一个数.推断数组中是否包括这个数 #include <stdio.h> #define col 4 #define rol 4 int yang(int(*p)[col], int num) { int i = 0; int j = col - 1; while (j+1) { int *q = &(p[i][j]); if

杨氏矩阵查找实现

杨氏矩阵查找 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二位数组和一个整数,判断数组中是否含有该整数. C#语言实现: public static bool yangShiFind(int[,] array, int num)         {             if (array == null)                 return false;             int m = array.

【C语言】二维数组中的查找,杨氏矩阵

//二维数组中的查找,杨氏矩阵 //在一个二维数组中,每行都按照从左到右的递增的顺序排序.每列都按照从上到下递增的顺序排序. //请完成一个函数,输入这样的一个数组和一个数,判断数组中是否包含这个数. #include <stdio.h> #define Col 4 int Yang(int arr[][Col], int val) { int i=0; int j = Col - 1; int tmp = arr[i][j]; //找到左上角的数 while (1) { if (tmp ==

在杨氏矩阵中查找一个数字是否存在

杨氏矩阵 有一个二维数组. 数组的每行从左到右是递增的,每列从上到下是递增的. 在这样的数组中查找一个数字是否存在. 时间复杂度小于O(N); 数组: 1  2  3    1  3  4    1  2  3 2  3  4    2  4  5    4  5  6 3  4  5    4  5  6    7  8  9 1 #include<stdio.h> 2 3 #define ROW 3 4 #define COL 3 5 6 int Find_num(int arr[ROW]

杨氏矩阵C++实现

何为杨氏矩阵?这个网上的介绍很多,下面给出杨氏矩阵搜索算法: #include <iostream> using namespace std; // 杨氏矩阵查找算法 bool Yang_search(int arr[][4], int N, int k) { if (k<arr[0][0] || k>arr[N - 1][N- 1]) { cout << "此值必不在此数组内" << endl; return false; } // 从