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

Posted 技术理科直男

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第二章 Caché 算法与数据结构 数组原理相关的知识,希望对你有一定的参考价值。

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

数组

  • 是有限相同类型的变量所组成的有序集合,数组中的每个元素被成为元。

  • 数组是最为简单,最为常用的数据结构。

  • 数组在内存汇总顺序存储

插入

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

 
   
   
 
  1. {4,3,6,7,9,5,,null,,null}

 
   
   
 
  1. {0,1,2,3,4,5,6,7}

尾部插入

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

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

 
   
   
 
  1. {0,1,2,3,4,5,6,7}

中间插入

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

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

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

 
   
   
 
  1. {0,1,2,3,4,5,6,7}

超范围插入

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

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

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

完整示例

  • 模拟JAVA,可以声明数组长度,数组越界等。

 
   
   
 
  1. int[] = new int[]{3,1,2,5,4,6,2}

数组类

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

  2. {


  3. Property array [ InitialExpression = {[]} ];


  4. Property size;


  5. Property length;


  6. Method init(capacity As %Integer)

  7. {

  8. d ..array.%Set(capacity - 1 ,"")

  9. s ..length = capacity

  10. s ..size = 0

  11. }


  12. Method insert(index As %Integer, element As %Integer)

  13. {

  14. /* 超出数组实际元素范围 */

  15. i (index < 0) || (index > ..size) d

  16. .throw ##class(PHA.COM.MOB.Exception).%New("超出数组实际元素范围!")


  17. /* 超出数组实际元素范围或扩容 */

  18. i ..size >= ..array.%Size() d

  19. .;throw ##class(PHA.COM.MOB.Exception).%New("超出数组实际元素范围!")

  20. .d ..resize()


  21. /* 从右向左,将元素逐个向右挪一位 */

  22. f i = (..array.%Size() - 1) : -1 : index d

  23. .d ..array.%Set(i + 1, ..array.%Get(i))


  24. /* 腾出位置放新元素 */

  25. d ..array.%Set(index, element)


  26. /* 保持数组长度 */

  27. d ..array.%Remove(..length)


  28. /* 长度增一 */

  29. s ..size = ..size + 1

  30. }


  31. Method output()

  32. {

  33. /* 遍历输出结果 */

  34. f i = 0 : 1 : ..size d

  35. .w ..array.%Get(i),!

  36. }


  37. Method delete(index As %Integer) As %Integer

  38. {

  39. /* 超出数组实际元素范围 */

  40. if (index < 0 )||(index >= ..size) d

  41. .throw ##class(PHA.COM.MOB.Exception).%New("超出数组实际元素范围!")


  42. /* 从左向右,将元素逐个向左挪一位 */

  43. s deletedElement = ..array.%Get(index)

  44. f i = index : 1 : ..size - 1 d

  45. .d ..array.%Set(i, ..array.%Get(i + 1))


  46. /* 长度减一 */

  47. s ..size = ..size -1


  48. /* 返回删除的元素 */

  49. q deletedElement

  50. }


  51. Method resize()

  52. {

  53. /* 数组扩容为原来二倍 */

  54. s arrayNew = []

  55. d arrayNew.%Set(..array.%Size() * 2 - 1 ,"")


  56. /* 给扩容数组重新赋值 */

  57. f i = 0 : 1 : (..array.%Size() * 2 - 1) d

  58. .d arrayNew.%Set(i, ..array.%Get(i))


  59. /* 把扩容数组赋值给原数组 */

  60. s ..array = arrayNew


  61. /* 重新赋值长度 */

  62. s ..length = ..array.%Size()

  63. }


  64. }

调用

 
   
   
 
  1. /// w ##class(PHA.YX.Arithmetic).Array()

  2. ClassMethod Array()

  3. {

  4. s $zt = "ErrArray"

  5. s array = ##class(PHA.YX.Arithmetic.Array).%New()

  6. d array.init(10)

  7. d array.insert(0,3)

  8. d array.insert(1,7)

  9. d array.insert(2,9)

  10. d array.insert(3,5)

  11. d array.insert(1,6)

  12. d array.insert(5,8)

  13. d array.insert(0,4)

  14. d array.insert(7,411)

  15. d array.insert(8,222)

  16. d array.insert(9,111)

  17. d array.insert(10,1343)

  18. d array.insert(11,23)

  19. //d array.delete(1)

  20. //d array.delete(1)

  21. //d array.delete(9)

  22. d array.output()


  23. q ""

  24. ErrArray

  25. q $ze

  26. }

 
   
   
 
  1. DHC-APP>w ##class(PHA.YX.Arithmetic).Array()

  2. 4

  3. 3

  4. 6

  5. 7

  6. 9

  7. 5

  8. 8

  9. 411

  10. 222

  11. 111

  12. 1343

  13. 23

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

 
   
   
 
  1. DHC-APP>w ##class(PHA.YX.Arithmetic).Array()

  2. 4

  3. 7

  4. 9

  5. 5

  6. 8

  7. 411

  8. 222

  9. 111

  10. 1343

思考

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


以上是关于第二章 Caché 算法与数据结构 数组原理的主要内容,如果未能解决你的问题,请参考以下文章

第十六章 Caché 算法与数据结构 计数排序

第十二章 Caché 设计模式 状态模式

基于`Caché/IRIS`实现`Socket`解决方案

针对 InterSystems Caché 中 DeepSee MDX 查询的 JSON 数据

第八章 Caché 设计模式 外观模式

第十七章 Caché 设计模式 单例模式