第二章 Caché 算法与数据结构 数组原理
Posted 技术理科直男
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第二章 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;
Property length;
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 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
思考
其实现的方式,还有多种,感兴趣大家可以私下实现一下
以上是关于第二章 Caché 算法与数据结构 数组原理的主要内容,如果未能解决你的问题,请参考以下文章