【数据结构-数组】杂记

1.合并两个已排序的数组


/** 
 * @author iamzken 
 * 2015-8-28 
 * 合并两个有序数组 
 * 
 */  
public class Sorter2 {  

public static void merge2SortedArray(int[] a , int[] b , int[] c){  
//a数组的当前索引  
int i = 0;  
//b数组的当前索引  
int j = 0;  
//c数组的当前索引  
int k = 0;  
//循环,只要a和b都没有遍历完就一直循环  
while(i < a.length && j < b.length){  
//如果当前a[i]比b[j]小,就把c[k]元素置为a[i],同时k++,i++  
if(a[i] < b[j]){  
c[k++] = a[i++];  
//否则,如果当前a[i]比b[j]大,就把c[k]元素置为b[j],同时k++,j++  
}else{  
c[k++] = b[j++];  
}  
}  

//上个循环能够结束,说明a已经循环完或b已经循环完  
//下述两个循环只能有一个满足循环条件  
//只要a没有循环完,就把a中剩下的元素依次放入c中  
while(i < a.length){  
c[k++] = a[i++];  
}  
//只要b没有循环完,就把b中剩下的元素依次放入c中  
while(j < b.length){  
c[k++] = b[j++];  
}  
}  
//测试程序  
public static void main(String[] args) {  
//待合并数组a  
int[] a = new int[]{1,3,5,7,9};  
//待合并数组b  
int[] b = new int[]{2,4,6,8};  
//c用来存放合并之后的数组  
int[] c = new int[a.length+b.length];  
merge2SortedArray(a, b, c);  
for(int i = 0;i < c.length;i++){  
System.out.print(c[i]+"\t");  
}  
}  

}  

2.【c/c++】【java】数组的大小也可以在运行时确定大小,即动态开辟空间。


3.由于广义表是对线性表和树的推广,并且具有共享和递归特性的广义表可以和有向图(见第7章)建立对应,因此广义表的大部分运算与这些数据结构上的运算类似。
  在此,只讨论广义表的两个特殊的基本运算:取表头head(Ls)和取表尾tail(Ls)。
  非空广义表的表头是一个元素,它可以是原子也可以是一个子表,而表尾则必定是表。例如:LS=(a,b),表头为a,表尾是(b)而不是b.另外:LS=(a)的表头为a,表尾为空表().
  非空广义表,除表头外,其余元素构成的表称为表尾,所以非空广义表尾一定是个表
  根据表头、表尾的定义可知:
任何一个非空广义表的表头是表中第一个元素,它可以是原子,也可以是子表,而其表尾必定是子表。
空表没表头和表尾


4 . 将对称矩阵中的n^2个元压缩存储在n(n+1)/2个元素的一维数组中,以行序为主序存储其下三角(包括对角线)中的元,假设一维数组sa[n(n+1)/2]作为n阶对称矩阵A的存储结构,则sa[k]和矩阵元素a[i,j]之间存在着一一对应的关系:
当i>=j时,k=i(i-1)/2+j-1;
当i< j时, k=j(j-1)/2+i-1;


5.
1.矩阵在内存中的存储

不管是D3D还是OpenGL,使用的矩阵都是线性代数标准的矩阵,只是在存储方式上有所不同。分别为:行主序(Direct3D),列主序(OpenGL)
存储顺序说明了线性代数中的矩阵如何在线性的内存数组中存储。
例如:内存中使用一个二维数组m存储矩阵,第i行第j列的表示方法分别为: 
行主序:m[i][j]

列主序:m[j][i]

线性代数意义的同一个矩阵,在d3d 和 openGL 中的存储顺序
这里写图片描述

行优先和列优先
如下矩阵:

这里写图片描述
根据行优先的原则,其排序方式为
这里写图片描述
根据列优先的原则,其排序方式为
这里写图片描述


6.【c/c++】
声明一个指向含有10个元素的数组的指针,其中每个元素是一个函数指针

/*
要声明一个数组指针,  一般我们想到的数组指针是 随便来一个 int(*p)[10],然后又说每个元素是一个函数指针,那么我们随便来一个 函数指针  int (*pf)(int *). 然后把(*p)[10]作为一个整体替代 pf     
即   int(*(*p)[10]))(int *);    
分析: 判断一个复杂式子看最高优先级的,*p是一个指针,然后(*p)外面是[],所以是数组指针,(*p)[10])描述完毕,然后再看外面int(*)(int *)很明显,这是一个函数指针,所以这个数组中每个元素是函数指针

7 .

将一个A[1..100,1..100]的三对角矩阵,按行优先存入一维数组B[1..298]中,A中元素A6665(即该元素下标i=66,j=65),在B数组中的位置K为()供选择的答案:
三对角矩阵有这样的特点: 只有对角线上以及对角线的两侧有值,其余元素为0.
所以,要存入B数组中的元素依次分别为A[1][1],A[1][2],A[2][1],A[2][2],A[2][3],A[3][2],A[3][3],A[3][4]....等,A6665 共有65 * 3 - 1 = 194个元素,而A6665是数组A第66行中有值的第一个元素,故其在B数组中的下标为195.

8.C语言中的字符串用指向该串首个字符的指针表示。不保存长度信息,用’\0’来标识字符串的终止。
因此相当于 char arrays[] = {‘C’, ‘h’, ‘i’, ‘n’, ‘a’, ‘\0’};


9.一个稀疏矩阵Am*n采用三元组形式表示
三元组做到下面三条便可实现矩阵的转置:
(1)将矩阵的行列值交换。
(2)将每个三元组中的 i 和 j 相互调换。
(3)重排三元组之间的次序。
前两条是容易做到的,关键是如何实现第三条。即如何使 b.data 中的三元组是以 T 的行(M 的列)为主次序依次排列的。


10.队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。


11.稀疏矩阵在采用压缩存储后将会失去随机存储的功能。因为在这种矩阵中,非零元素的分布是没有规律的,为了压缩存储,就将每一个非零元素的值和它所在的行、列号做为一个结点存放在一起,这样的结点组成的线性表中叫三元组表,它已不是简单的向量,所以无法用下标直接存取矩阵中的元素。


12.矩阵乘法
这里写图片描述
计算规则是,第一个矩阵第一行的每个数字(2和1),各自乘以第二个矩阵第一列对应位置的数字(1和1),然后将乘积相加( 2 x 1 + 1 x 1),得到结果矩阵左上角的那个值3。


13.用三元组表示该矩阵时,所需的字节数
每个元素要用行号,列号,元素值来表示,在用三元组表示稀疏矩阵,还要三个成员来记住,矩阵的行数列数,总的元素数

typedef struct{
    int i; //行号
    int j; //列号
     elemtype d; //元素值
}

typedef struct{
    int md; //行数
    int nd; //列数
    int td; //非零元个数
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值