从锦囊妙计想到的28–程序的空间和时间

前面已经说了很多程序上的事情, 今天会引入一个程序中的两个概念, 这两个概念是非常重要的事情!

1. 程序的空间,    通常是指程序  运行时的 占用空间, 最通俗的说 就是占用内存的情况, 当然也有占用磁盘的空间的情况, 但是考虑到磁盘 空间都比较大, 不会太紧张因此, 空间通常指  内存。  另外若是您到了开发大数据的级别那么磁盘空间就要考虑了, 原因是磁盘空间会有空间同时还有访问时间的问题。

2. 程序的时间, 通常是指  程序运行时  需要的时间, 或者花费的时间。   其实后面还有一个 开发时间, 也就是开发效率的问题。  今天就不说明了。

一。 程序空间和时间的意义

举个例子, 大家都熟悉房地产了, 那么在相同面积上盖的楼越多, 最后能卖出的价格就越多, 这么就是为什么都盖高层的缘故了。

类似的, 若是 卖出的价格相同,   占用的面积越小, 越有意义是吧。

程序也是, 就是实现相同功能的情况下, 需要的内存越少, 那么整个计算机就有能力做更多的工作。

在早期的计算机 内存是k的, 有个几百个kb就很多, 后来内存多少M, 也很可怜, 现在尽管是多少G了, 但是计算机的任务也越多了, 需要的内存也越大了。

因此内存占用还是要考虑的。  但不用像以前那么斤斤计较了。

举个例子, 有两个人早上上班没吃早饭, 他们来到了一个煎饼果子面前, 甲去买了一份煎饼果子吃了,用了5元钱, 很高兴, 真便宜。 然后乙也去吃了一份一样的, 画了2元钱。 那么那个更合算?

都知道答案。

明确一下:

程序的空间 通常是指 程序运行时 占用的 内存空间

程序的时间 通常是指 程序运行时  消耗的时间

二。 使用二维数组进行缓存的内存占用情况分析

1. 如下图, 我们要输出如下图形的数据, 看看如何解决

从锦囊妙计想到的28–程序的空间和时间

图上图, 这个图形同前面采用二维数组作为辅助对象存储数据, 然后进行分布处理,最后输出是一样的道理

具体实现就不写了。

2. 分析一下二维数组实现的优劣

优点:   二维数组实现简单高效

缺点:  在数组非常大时, 有浪费空间的情况

声明数组如下:

char[][]   tmpBuffer = new char[12][12];

由于二维数组中每行的长度必须相同

具体情况如下:

从锦囊妙计想到的28–程序的空间和时间

从上图中 可以看到绿色部分的数据 是浪费的, 因此我们若是采用多个 一维数组, 没个数组长度不同, 然后在把这些一维数组串接到一起就方便了。

从锦囊妙计想到的28–程序的空间和时间

用上面的办法进行了多个临时缓存的设置, 那么如何把这些a1,a2, a3, a4 … 都串联到一起?

3. 用链表 连接不同的对象到一起

什么是链表? 就是用一条链把一些列的东西连接起来, 让这些东西可以从开头一个一个的找到最后的一个东西, 如下图

从锦囊妙计想到的28–程序的空间和时间

上图最开始是我们刚开始的a1缓冲区, 然后是a2, 然后是a3, 最后是a12

三。java实现图形打印

1. 启动eclipse软件, 创建java项目

2. 编写相关函数

参考源代码如下:

import java.util.LinkedList;
public class MyListTuXing {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//System.out.println("采用list做临时图形输出");
		shuChuTuXing(12, 4, 7, 3);
	}
	/**
	 * 这个函数 负责输出具体的 图形
	 * @param lineCount    三角形的行数, 每一行有一个 同行数相同的*
	 */
	public static void shuChuTuXing(int lineCount, int left, int top, int line)
	{
		// 生命一个 list 对象,  用来 存储没一行的 的缓存
		LinkedList< object > tmpBuffer = new LinkedList< object >();

		// 循环 处理每一行
		for(int i = 0; i < lineCount; i++)
		{
			// 声明一个行的缓存区
			char[] tmpLineBuffer = new char[i+1];

			// 处理一行
			shuChuLineTuXing(tmpLineBuffer, i+1);

			// 把处理好的  这一行数据 添加到 链表中
			tmpBuffer.add(tmpLineBuffer);
		}

		// 这个是 输出空白图形的函数,  若是在输出 空白时, 有问题, 应该在这个函数里面
		shuChuKongBaiXing(tmpBuffer, left, top, line);

		shuAllTuXing(tmpBuffer);

	}
	/**
	 * 在已经有的缓存区中 输出一个 空白的 图形结构
	 * @param list     缓存区列表
	 * @param left     空白开始在左边第几个 位置
	 * @param top      空白开始在 上面开始的第几行
	 * @param lineCount   总计有多少行
	 */
	public static void shuChuKongBaiXing(LinkedList list, int left, int top, int lineCount)
	{
		// 循环处理  每一行
		for(int i = 0; i < lineCount; i++)
		{
			// 获取每一行的 数据
			 object  o = list.get(i + top);
			char[] tmpBuffer = (char[]) o;

			// 输出 每一行的数据
			shuChuKongBaiXingLine(tmpBuffer, left, i+1);
		}
	}
	/**
	 * 输出 每一行的  空白  图形
	 * @param tmpBuffer   临时缓存区
	 * @param left     左边开始的位置
	 * @param Line     第几行
	 */
	public static void shuChuKongBaiXingLine(char[] tmpBuffer, int left, int Line)
	{
		for(int i = 0; i < Line; i++)
		{
			tmpBuffer[left - i] = ' ';
		}
	}
	/**
	 * 输出全部的 图形信息
	 * @param list
	 */
	public static void shuAllTuXing(LinkedList list)
	{
		// 循环输出全部的数据
		for(int i = 0; i < list.size(); i++)
		{
			// 获取当前行, 数据
			 object  o = list.get(i);
			// 做强制类型转换
			char[] lineBuffer = (char[])o;
			// 在这行里面, 做循环 输出每一个  字符
			for(int j = 0; j < i + 1; j++)
			{
				// 输出每个 字符
				System.out.print(lineBuffer[j]);
			}
			// 输出换行
			System.out.println();
		}
	}

	/**
	 * 这个函数输出  每一行的  *
	 * @param buffer           行缓存
	 * @param lineXingCount    第几行, 就是这个行有几个*
	 */
	public static void shuChuLineTuXing(char[] buffer, int lineXingCount)
	{
		for(int i = 0; i < lineXingCount; i++)
		{
			buffer[i] = '*';
		}
	}

}

上面代码中, 通过采用     LinkedList<Object> tmpBuffer = new LinkedList<Object>();

方式声明了一个 临时缓存区 , 然后再这个缓存区里面, 把每一行的  缓存数据存储起来, 然后进行统一处理。

通过这个办法可以有效的节省 二维数组的空间浪费的问题。

【二位数组】

66

原文 

http://www.iigrowing.cn/cong_jin_nang_miao_ji_xiang_dao_de_28_cheng_xu_de_kong_jian_he_shi_jian.html

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » 从锦囊妙计想到的28–程序的空间和时间

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址