1. 数据结构 数组存储地址的计算
数组存储地址的计算:以二维数组为例,其他的依次类推:
假设起始下标从0开始,按行存储(总共有M行,N列):
A[i][j]=A[0][0]+(i*N+j)*L
这地方的L是数组中的一个元素所占的存储空间
例如:
第一个元素的地址“值”就是数组的地址“值”,只不过类型不一样,强转一下就可以了。
int ary[5];
int* pInt = &ary[0];
int (*pAry)[5] = &ary;
printf("First: %p ", pInt);
printf("Array: %p ", pAry);
(1)数组的存储效率怎么算扩展阅读:
一个数组中的所有元素具有相同的数据类型(在C、C++、Java、pascal中都这样。但也并非所有涉及数组的地方都这样,比如在Visual Foxpro中的数组就并没这样的要求)。当然,当数据类型为 Variant 时,各个元素能够包含不同种类的数据(对象、字符串、数值等等)。可以声明任何基本数据类型的数组,包括用户自定义类型和对象变量。
2. c++中多维vector(三维及其以上)与多维数组的存取效率(调用效率,寻址效率)哪个高,请解释的具体点。
这个得看你的具体操作,如果你需要经常增减数据,那么肯定那个是vector效率更高。
但是如果你需要查找的话,那么数组是最快的。
3. 数据结构、数组存储的地址怎么计算
数组存储地址的计算:
以二维数组为例,其他的依次类推
假设起始下标从0开始,按行存储(总共有M行,N列):
A[i][j]=A[0][0]+(i*N+j)*L
这地方的L是数组中的一个元素所占的存储空间。
或:
即使A[8][5]前面有多少个元素,
行下标i从1到8,列下标j从1到10,所有A[8][5]之前共有n7*10+4(74)个元素,
每个元素的长度为3个字节,故共有3*74=222个字节
首地址是SA,则A[8][5]地址是SA+222
(3)数组的存储效率怎么算扩展阅读:
在数据的顺序存储中,由于每个元素的存储位置都可以通过简单计算得到,所以访问元素的时间都相同;而在数据的链接存储中,由于每个元素的存储位置保存在它的前驱或后继结点中,所以只有当访问到其前驱结点或后继结点后才能够按指针访问到,访问任一元素的时间与该元素结点在链式存储结构中的位置有关。
4. C语言中如何计算一个数组占内存多少空间
C语言中数组的sizeof值等于数组所占用的内存字节数。
C语言中有一个专门用于检测类型或变量或数组在内存中所占有的空间(字节数)的操作符sizeof,用sizeof可以直接检测出数组在内存占有的字节数。
语法规则是:sizeof(x); (识别没有歧义时也可写成sizeof x;)——其中x是类型名、变量名或数组名等,返回x所占字节数(int型)。
(4)数组的存储效率怎么算扩展阅读:
sizeof的使用规则:
1、基本数据类型的sizeof:
这里的基本数据类型指short、int、long、float、double这样的简单内置数据类型,由于它们都是和系统相关的,所以在不同的系统下取值可能不同,这务必引起我们的注意,尽量不要在这方面给自己程序的移植造成麻烦。一般的,在32位编译环境中,sizeof(int)的取值为4。
2、指针变量的sizeof:
指针变量的sizeof值与指针所指的对象没有任何关系,正是由于所有的指针变量所占内存大小相等,所以MFC消息处理函数使用两个参数WPARAM、LPARAM就能传递各种复杂的消息结构(使用指向结构体的指针)。
5. python如何计算数组内存
数组定义为存储在连续内存位置的项目的集合。这是一个可以容纳固定数量项目的容器, 这些项目应为同一类型。数组在大多数编程语言(例如C / C ++, JavaScript等)中都很流行。
数组是将多个相同类型的项存储在一起的想法, 并且只需在基本值上添加一个偏移量, 就可以更轻松地计算每个元素的位置。数组的组合可以通过减少代码的整体大小来节省大量时间。它用于在单个变量中存储多个值。如果你有一个存储在其相应变量中的项目列表, 如下所示:
car1 =”兰博基尼”
car2 =”布加迪”
car3 =” Koenigsegg”
如果要遍历汽车并找到特定的汽车, 可以使用该数组。
数组可以在Python中由名为array的模块处理。当我们只需要操作特定的数据值时, 这很有用。以下是了解数组概念的术语:
元素-存储在数组中的每个项目称为元素。
索引-数组中元素的位置具有数字索引, 该数字索引用于标识元素的位置。
数组表示
数组可以用各种方式和不同的语言声明。应考虑的重点如下:
索引从0开始。
我们可以通过其索引访问每个元素。
数组的长度定义了存储元素的能力。
数组运算
数组支持的一些基本操作如下:
遍历-逐一打印所有元素。
插入-在给定的索引处添加一个元素。
删除-删除给定索引处的元素。
搜索-它使用给定的索引或值搜索元素。
更新-更新给定索引处的元素。
6. 关于数组效率的小问题
在经过优化的编译器上,运行效果是一样的.
如果没有进行优化,那么写法2的效率要高一些.(高不了多少)
分析如下:
我们先来看一下数组是怎么取值的.
M[i]---> M的首地址 + i(偏移量)
第一种写法.
c=a+b;计算出a和b的值,这个在加法器上很好实现.效率很高.
M[c]; M的首地址.加上偏移量c,然后取值.
第二种写法:
M[a+b];等价于*(m+a+b);聪明的你,应该知道是怎么回事了吧??
所以,总结如下:
如果纯粹从效率的角度考虑,第二种优于(或等于)第一种,但是这种优势,可以忽略不计.
如果为了代码的清晰,假设c没有实际意义.
那么M[a+b];这种更清晰一些.(免得回头去查看c的值)/
7. C 语言 数据结构 数组存储位置的计算
1)存放该数组需要242个单元
2)存放第四列需要22个单元
3)按行存放,元素a[7,4]起始地址为 s+182
4)按列存放,元素a[4,7]其实地址为 s+142
8. 数组算法复杂度分析,效率。
关于算法复杂度的问题,是通过算法的步数,和时间还有一个就是内存的占用
还有就是程序转换成机器语言时的大小!
时间你这个是不太好表示了!因为程序太小!
但步数是可以表示的!你可以在程序中间加一个变量记录他的运行次数!但有时会步数一样多!这时就要看他的内存占用啊!语句长短啊!
综合以上
你这个是第一个效率高!
9. C语言用数组存储大型数据的算法
/*
size_a,pa——指向数组a的有效末端
ma——a的最大容量,必须大于na
n=12——求n的阶
p——求阶乘时的当前乘数
*/
#include<stdio.h>
#define Ma 10000
int pa;/*指向数组a的有效末端*/
int p=2;
int memory_over=0;
union data
{ unsigned long int b;
struct
{unsigned l:16;
unsigned h:16;
}m;
}a[Ma];
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
算法说明1:考虑到result比较长,我用a[Ma].b来存储n!的result,每一位a[pa].b能存储4位10进制数字。
因为我定义的数组是静态的,所以Ma应该足够大。
ps:其实只用定义一个unsigned long int b[Ma];就可以了(直接用b[pa]代替a[pa].b),但是我考虑到可能会访问每一结点b[pa]的高16位(a[pa].m.h)和低16位(a[pa].m.l),但是的我考虑是多余的!!不用像我这样定义这么复杂的共用体!!
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
unsigned int cashe;
unsigned int carry;
void main()
{
unsigned int n;/*求n的阶*/
void facto(unsigned int n);
printf("Input n:");
scanf("%u",&n);
/*=================开始求阶乘!=============*/
a[0].b=1;/*初始化*/
facto(n);
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
算法说明2:上面这句直接调用facto(n)来求n!
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*========================以下是显示最后结果====================================*/
if(memory_over==0)
{printf("the result include %dNO:\n",pa+1);
printf("%u",a[pa--].m.l);
for(;pa>=0;pa--)
printf("%04u",a[pa].m.l);
printf("\n");
}
getch();
}
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
算法说明2:求阶函数facto(n)说明:
这个函数会不断地调用multiple(),它的作用是每被调用一次就使得a[pa].b与阶数p相乘一次,直到乘完n为止!
{multiple();
p++;/*每一轮乘一个阶数p*/
}
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
void facto(unsigned int n)
{void multiple();
pa=0;
while(pa<Ma-1&&p<=n)/*容量限制*/
{multiple();
p++;/*每一轮乘一个阶数p*/
}
if(p<=n)
{printf("memory out!\n");memory_over=1;}/*如果当前的存储结果的数组a[Ma]不够用!应提高Ma*/
}
/*==============================================================================
算法说明3:乘法函数multiple()说明:负责a[pa].b与阶数p相乘。
a[pa].b有很多结点,a[0].b、a[1].b、a[2].b、a[3].b、a[4].b、。。。
当然是从低结点a[0].b开始不断与p相乘,产生的“进位”加到高位a[1].b,直到a[pa].b*p为止!
随着结果数值增大,pa个结点的a[].b可能容纳不下结果,所以如果a[pa].b与p相乘后还有“进位”carry,就扩大pa,并把carry放入到新增加的结点:
if(carry>0)
a[++pa].b=carry;
===================================================================================*/
void multiple()
{int i=0;
carry=0;
while(i<=pa)/*i指向当前处理的元素a[i],每一轮用一个位与阶数p相乘*/
{a[i].b=a[i].b*p+carry;/*计算结果,要考虑来自低位的进位*/
carry=a[i].b/10000;/*计算进位*/
a[i].b=a[i].b%10000;/*计算余数*/
i++;
}
if(carry>0)
a[++pa].b=carry;
}
10. 计算数组存储的问题:
行数:9(0..8)
列数:10(1..10)
每个数组元素占用的空间:6字节 每个字符占1字节
存储M的总空间:9 * 10 * 6 = 540字节。
第8列总共9个元素(因为总共9行),每个元素占6个字节,共54字节。
第5行总共10个元素(因为总共10列),每个元素占6个字节,共60字节
因为第58个元素重复所以减去6,所以是108字节