2023-09-20|閱讀時間 ‧ 約 6 分鐘

学习日记[5]

    先完成昨天剩下的任务吧,图片和视频在计算机中的存储方式。

    记得上文说过,图片和音频的存储方式相似,但只是图片其中的一种。图片大抵有两种存储方式,分别是位图和矢量图。位图的存储方式就和音频的存储方式相同,采样,量化和存储。采样:位图的样本是像素,整张图片就是有一个个像素点拼出来的,所以可以理解成一块拼图。固然把每一小块用尽可能多的像素点表示出来图片会很清晰,但问题也是一样,存储空间不足。所以一小块到底该用多少个像素点来表示就成了一个问题,通常我们把这种参数称为解析率,形象一点说就是每一小块到底该用多少块拼图表示。量化:我们就需要搞定每一个像素点用多少位存储和如何存储,毕竟这不像是音频里面的样本都是数字,这里的都是颜色,我们需要用一种方式来存储一种颜色。统一的方式是真彩色模式,用24位存储一个像素,并且把这个24位像素分为三等分,分别用来存储R(red),G(green),B(blue)三种颜色。用十进制表达出来就是(R,G,B),这里的每一个字母都是有范围的(0-255,用无符号整数表示八位二进制数的范围就是这个),所以纯红色的表达方式就是(255,0,0),最后将这些图片中像素点的无符号二进制整数的值存储进计算机即可。但是真彩色可以表示的颜色是2^24种,而如果我们只需要其中的一部分就够用了,可以用索引色模式。相信看到这里你也就清楚了,索引色模式其实也就是在真彩色模式中提取一些颜色并赋予其新的编码(通常来说是256种颜色)。说的不太准确,应该是放在一个八位存储空间内,这也就是为什么最多可存储的是256种颜色。

    另外一种是矢量图,也就是用矢量、数学公式存储一个图片。将一张图片划分为若干个几何体,每一个几何体都用一系列的数学公式表示出来并用特殊的编码方式存储,需要显示图片时就将所需要的图片比例输入该系统,该系统再将一系列该比例下的参数代入公式中并且显示出来。用这种方式存储的图片无论放多大都是清晰的。因为是根据用户提供的数据来提供服务,所以也叫作面向对象图片(这里提到了面向对象的思想,具体的后面学到java再说吧)。

    图片我们知道是如何存储的了,那么视频也就简单了。视频就是动起来的图片,每一张图片的名字改成了帧,也就是视频由帧组成的,帧数越高,视频看起来也就更灵动。知道了这个,视频也就是存储一张张图片,需要的时候将其解析出来即可。

    昨天的任务完成了,那就开始今天的内容吧。数据结构,感觉有点像是以前说过的计算机外部数据的存储方式,先不管了,等学到再说吧。数据结构分为数据的逻辑结构、物理结构和数据之间的运算。逻辑结构又可以分为线性结构和非线性结构。线性结构的概念很简单,数据之间就像一条线串起来的一般,是一一对应的关系。非线性结构分为树,图与集合。树是一对多的关系,由于看起来很像树根,所以形象地称之为树。图是多对多的关系,没有固定的形状。集合是借用数学的概念(不同学科的根都是一样的),就是在集合中的元素都是平等的,不存在从属关系。物理结构就是逻辑结构在计算机中的实现方式,有顺序存储和链式存储两种方式。顺序存储是将数据都放在相邻的内存地址中,而链式存储是放在不相邻的内存地址中,但是她们个个数据之间都是有逻辑关系的。也就是说,顺序存储是逻辑位置都相邻,而链式存储是逻辑相邻但是位置不相邻。数据之间的运算包括但不仅限于查找,排序和删除。

    然后介绍了两个衡量算法的特征——空间复杂性和时间复杂性。空间复杂性是指应用程序在计算机当中所占存储空间的大小,时间复杂性是指程序在计算机当中运行所需要的时间。空间复杂性相对来说更好的衡量,实在不行我们直接看程序大小就行,但是时间复杂度的影响因素有很多,比如计算机性能,编程语言的高级程度,编译和解释的选择,问题的难易程度等。性能越高,语言越低级(这里确实是低级,越接近01,运算速度就越快,不需要编译或者解释),选择编译而不是解释,问题越简单,运算时间就越少。那么我们该如何选择呢?规则制定者选择了问题的难易程度,可能是因为这是里面少数可以进行衡量的变量吧。规则制定者用O(n)这个符号来表示时间复杂度,其中n是一个代号,他可以是任何数字或者是n的多少次幂。其中如果程序中有双重循环,那么复杂度就是O(n^2),单循环就是O(n)(这里的n是正整数)。其中,时间复杂度最低的就是O(1)。

    接着是数据排列的一种方式——插入排序。原理是选取一组数中最小或者最大的数,然后将该数和第一个数交换位置,这个位置就是已排列的。然后从未排列位置重复操作,直到最后一位排列完成。

    for(int count1 = 0 ; count1 < N - 1 ; count1++)
    {
    int temp;
    int count3;
    temp = array[count1];
    for(int count2 = count1 + 1 ; count2 < N - 1 ; count2++)
    {
    if(temp < array[count2])
    {
    temp = array[count2];
    count3 = count2;
    }
    }
    if(count1 != count3)
    {
    int tamp = array[count3];
    array[count3] = array[count1];
    array[count1] = tamp;
    }
    }

    这是我按照原理自己敲出来的,肯定有改正的空间,希望各位大佬指点。

    剩下的时间我就预习明天课程的内容了,晚安各位。


    分享至
    成為作者繼續創作的動力吧!
    © 2024 vocus All rights reserved.