第二章 Caché 算法与数据结构 数组原理

文章目录

第二章 Caché 算法与数据结构 数组原理

数组

  • 是有限相同类型的变量所组成的有序集合,数组中的每个元素被成为元。
  • 数组是最为简单,最为常用的数据结构。
  • 数组在内存汇总顺序存储

插入

数组的实际元素数量可能小于数组的长度:

{4,3,6,7,9,5,,null,,null}
{0,1,2,3,4,5,6,7}

尾部插入

尾部插入一个10,直接把插入的元素放在数组尾部的空闲位置即可!

{4,3,6,7,9,5,10,,null}
{0,1,2,3,4,5,6,7}

中间插入

中间插入,把插入位置及后面元素向后移动,腾出地方,在把插入的元素放到对应的数组位置。

10 后面 6,7,9,5 向右移出一位。

{4,3,10,6,7,9,5,,null}
{0,1,2,3,4,5,6,7}

超范围插入

已经达到数组最大长度,在插入即超过数组最大限度。此时创建新数组,为原数组的长度2倍,在把旧数组的元素统统复制过去。

{4,3,10,6,7,9,5,1,2,null,null,null,null,null,null}
{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}

完整示例

  • 模拟JAVA,可以声明数组长度,数组越界等。
int[] = new int[]{3,1,2,5,4,6,2}

数组类

Class PHA.YX.Arithmetic.Array Extends %RegisteredObject
{

Property array [ InitialExpression = {[]} ];

Property size [ InitialExpression = 0 ];

Property length [ InitialExpression = 0 ];

Method init(capacity As %Integer)
{
	d ..array.%Set(capacity - 1 ,"")
	s ..length = capacity
	s ..size = 0
}

Method insert(index As %Integer, element As %Integer)
{
	/* 超出数组实际元素范围 */
	i (index < 0) || (index > ..size) d
	.throw ##class(PHA.COM.MOB.Exception).%New("超出数组实际元素范围!")
	
	/* 超出数组实际元素范围或扩容 */
	i ..size >= ..array.%Size() d
	.throw ##class(PHA.COM.MOB.Exception).%New("超出数组实际元素范围!")
	.;d ..resize()
	
	/* 从右向左,将元素逐个向右挪一位 */
	f i = (..array.%Size() - 1) : -1 : index d
	.d ..array.%Set(i + 1, ..array.%Get(i))
	
	/* 腾出位置放新元素 */
	d ..array.%Set(index, element)
	
	/* 保持数组长度 */
	d ..array.%Remove(..length)
	
	/* 长度增一 */
	s ..size = ..size + 1
}

/// 获取数组下标的值
Method get(index As %Integer)
{
	q ..array.%Get(index)
}

/// 给数组下标赋值
Method set(index As %Integer, element As %Integer)
{
	q ..array.%Set(index, element)
}

/// 获取数组长度
Method length()
{
	q ..length
}

Method output()
{
	/* 遍历输出结果 */
	f i = 0 : 1 : ..size d
	.w ..array.%Get(i),!
}

Method delete(index As %Integer) As %Integer
{
	/* 超出数组实际元素范围 */
	if (index < 0 )||(index >= ..size) d
	.throw ##class(PHA.COM.MOB.Exception).%New("超出数组实际元素范围!")
	
	/* 从左向右,将元素逐个向左挪一位 */
	s deletedElement = ..array.%Get(index)
	f i = index : 1 : ..size - 1 d
	.d ..array.%Set(i, ..array.%Get(i + 1))
	
	/* 长度减一 */
	s ..size = ..size -1
	
	/* 返回删除的元素 */
	q deletedElement
}

Method resize()
{
	/* 数组扩容为原来二倍 */
	s arrayNew = []
	d arrayNew.%Set(..array.%Size() * 2 - 1 ,"")
	
	/* 给扩容数组重新赋值 */
	f i = 0 : 1 : (..array.%Size() * 2 - 1)  d
	.d arrayNew.%Set(i, ..array.%Get(i))
	
	/* 把扩容数组赋值给原数组 */
	s ..array = arrayNew
	
	/* 重新赋值长度 */
	s ..length = ..array.%Size()
}

}


调用

/// w ##class(PHA.YX.Arithmetic).Array()
ClassMethod Array()
{
	s $zt = "ErrArray"
	s array = ##class(PHA.YX.Arithmetic.Array).%New()
	d array.init(10)
	d array.insert(0,3)
	d array.insert(1,7)
	d array.insert(2,9)
	d array.insert(3,5)
	d array.insert(1,6)
	d array.insert(5,8)
	d array.insert(0,4)
	d array.insert(7,411)
	d array.insert(8,222)
	d array.insert(9,111)
	d array.insert(10,1343)
	d array.insert(11,23)
	//d array.delete(1)
	//d array.delete(1)
	//d array.delete(9)
	d array.output()
	
	q ""
ErrArray
	q $ze
}
DHC-APP>w ##class(PHA.YX.Arithmetic).Array()
4
3
6
7
9
5
8
411
222
111
1343
23
 

把注释放开,看删除节点。

DHC-APP>w ##class(PHA.YX.Arithmetic).Array()
4
7
9
5
8
411
222
111
1343
 
 

思考

其实现的方式,还有多种,感兴趣大家可以私下实现一下

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yaoxin521123

谢谢您的支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值