为什么要进行数据密集型计算

Python016

为什么要进行数据密集型计算,第1张

数据密集型计算指能推动前沿技术发展的对海量和高速变化的数据的获取、管理、分析和理解。这包含了三层含义:

●它所处理的对象是数据,是围绕着数据而展开的计算。它需要处理的数据量非常巨大,且快速变化,它们往往是分布的、异构的。因此,传统的数据库管理系统不能满足其需要。

●"计算"包括了从数据获取到管理再到分析、理解的整个过程。因此它既不同于数据检索和数据库查询,也不同于传统的科学计算和高性能计算。它是高性能计算与数据分析和挖掘的结合。

●它的目的是推动技术前沿发展,要想推动的工作是那些依赖传统的单一数据源、准静态数据库所无法实现的应用。

看见这个题目,也许有些人就会嘀咕了:难道两者不是一样的吗?C语言的多维数组不就是数组的数组吗?不!两者是有区别的,而且还不小呢。首先看看两者的共同点:

1。内存映象一样。

2。数组引用方式一样,都是“数组名[下标][下标]........”。

3。数组名都是数组的首地址,都是一个符号地址常量、一个右值。

由于两者的共同点主要反映在外部表现形式上,因此,从外部看来,数组的数组跟多维数组似乎是一样的,这造成了C程序员对两者的区别长期以来模糊不清。但实际上,c语言限于本身的语言特性,实现的并非真正的多维数组,而是数组的数组。

数组的数组与多维数组的主要区别,就在于数组的数组各维之间的内在关系是一种鲜明的层级关系。上一维把下一维看作下一级数组,也就是数组嵌套。数组引用时需要层层解析,直到最后一维。举个例,对于数组:

int a[7][8][9];

如果要访问元素a[4][5][6],首先就要计算第一维元素4的地址,也就是a+4,由于是数组的数组,元素4的值代表了一个数组,因此元素4的值就是它所代表的那个数组的首地址,我们用一个符号address1代表它,也就是address1=*(a+4),接着计算第二维,显然元素5的地址是address1+5,其值也是一个数组的首地址,用address2表示它,就是address2=*(address1+5),最后一维,由于已经到达了具体的元素,因此这个元素的地址是address2+6,其值*(address2+6)是一个整数,把address1和address2分别代入相应表达式,就成了:

*(*(*(a+4)+5)+6)

这就是我们熟知的[]运算符的等价表达式。

而真正的多维数组并没有这么多“束缚”,相比之下简单得多,由于各维之间不是这种复杂的层级关系,元素a[4][5][6]的偏移量可以这样直接获得:(4x8x9+5x9+6)xsizeof(int),再加上数组的首地址a就是元素a[4][5][6]的地址了。但是,c语言的数组能够这样用首地址加上(4x8x9+5x9+6)xsizeof(int)的形式来访问元素吗?显然是不行的。归根到底就在于C语言的地址数据类型不但有类型,还具有级别。就是这种层级关系造成了C语言只能用数组的数组当作多维数组。如果C语言非得要实现真正的多维数组,那么地址与指针的概念就得重新改写了。

#include<stdio.h>

#include<math.h>

int main()

{

    int sum=0

    int n,a

    scanf("%d", &n)

    for (int i=1i<=ni++)

    {

        a=pow(2,i)

        sum=+sum

    }

    printf("%d\n", sum)

    

    return 0

}