数据结构中的数组(Operations)

⚡ 智能摘要

数据结构中的数组将多个相同数据类型的元素存储在连续的内存位置,每个位置都可以通过索引访问。本教程解释了数组的概念、数组的重要性以及如何创建和操作数组。 Python, C++和 Java 用例子。

  • 📦 核心定义: 数组将多个相同类型的元素存储在相邻的内存空间中,并通过索引进行访问。
  • ⚡ 快速访问: 使用索引可以在恒定时间内检索任何元素。
  • 🛠️ 五岁 Opera位置: 使用数组工具包进行插入、删除、搜索、更新和遍历操作。
  • 🌐 跨语言: Python 使用数组模块; C++ 和 Java 使用手动逻辑以原生方式声明数组。
  • 🤖 人工智能相关性: 数组是张量和矩阵的基础,而张量和矩阵是机器学习计算的动力源泉。

数据结构中的数组(Operations)

数据结构中的数组是什么?

An 排列 数组是一种用于存储多个相同数据类型数据项的数据结构。数组中的数据项分配在相邻的内存位置,这些位置称为内存单元。 分子 数组的元素总数。数组中元素的总数就是它的 长度.

每个元素都通过其位置进行访问,这种引用称为…… 指数 or 下标.

数组的概念

数组的概念图

数组的概念图

上图说明了:

  1. 数组是元素的容器。
  2. 元素具有特定的值和数据类型,例如“ABC”、TRUE 或 FALSE。
  3. 每个元素都有自己的索引,通过索引可以访问该元素。

注意:

  • 元素存储在连续的内存位置。
  • 索引总是小于数组项的总数。
  • 任何声明为数组的变量都可以存储多个值。
  • 几乎所有语言都共享数组的概念,但在声明和初始化数组的方式上有所不同。
  • 在所有初始化过程中,有三个部分是相同的:数组名称、元素和元素的数据类型。

下图显示了声明的语法 数组输入 Python 和 C++这表明,即使不同语言的语法略有不同,概念也保持不变。

理解数组的语法

理解数组的语法

  • 数组名称: 需要便于查阅元素集合。
  • 数据类型: 用于类型检查和数据完整性。
  • 内容: 数组中存在的数据值。

为什么我们需要数组?

  • 数组非常适合在单个变量中存储多个值。
  • 它们能够轻松快速地处理大量数值。
  • 使用数组可以更轻松地对值进行排序和搜索。

在中创建数组 Python

In Python数组与列表不同:列表可以包含不同数据类型的项,而数组只能包含相同数据类型的项。 Python 它有一个单独的模块来处理数组,名为 array必须先导入才能使用。

注意: 数组必须包含实数,例如整数和浮点数;不允许包含字符串。

以下代码创建了一个整数数组 Python 存储账户余额:

import array
balance = array.array('i', [300, 200, 100])
print(balance)

声明数组的方法 Python

您可以在中声明一个数组 Python 使用以下语法进行初始化:

arrayName = array.array(typecode, [array_items])

数组的语法 Python

数组的语法 Python

  1. 识别: 像平时给变量命名一样,给它指定一个名称。
  2. 模块: Python 它有一个名为“array”的特殊模块,您必须先导入该模块。
  3. 方法: 数组模块有一个用于初始化数组的方法,它接受两个参数——类型代码和元素。
  4. 类型代码: 使用可用的类型代码指定数据类型(见下表)。
  5. 内容: 用方括号指定数组元素,例如 [130, 450, 103]。

下表列出了受支持数据类型的可用类型代码。

类型代码 C型 Python 类型 最小大小(字节)
'b' 签名字符 INT 1
'B' 无符号的字符 INT 1
'u' UNICODE 代码 Unicode字符 2
'H' 签署短 INT 2
'H' 无符号的短 INT 2
'一世' 有符号整数 INT 2
'一世' 无符号整数 INT 2
'我' 已签署长期 INT 4
'L' 无符号长 INT 4
'F' 浮动 浮动 4
'd' 翻番 浮动 8

如何访问数组中的特定值?

您可以使用索引访问数组中的任何元素。

语法:

arrayName[indexNum]

计费示例:

balance[1]

访问数组元素

访问数组元素

在这里,我们使用索引 1 访问了数组的第二个值。输出为 200,这是余额数组的第二个值。

import array
balance = array.array('i', [300, 200, 100])
print(balance[1])

输出:

200

排列 Opera在 Python

此 Python 数组模块提供了用于数组操作的独立函数。这些操作是破坏性的,意味着修改会直接保存在数组变量中。

插页

此操作将一个或多个元素插入数组的开头、结尾或任何给定的索引位置。它接受两个参数:索引和值。

arrayName.insert(index, value)

计费示例: 要在索引 1(值 200)之后插入新值,请在插入方法中引用索引 2。

import array
balance = array.array('i', [300, 200, 100])
balance.insert(2, 150)
print(balance)

输出:

array('i', [300, 200, 150, 100])

删除

此操作按值从数组中删除一个元素,接受一个参数。操作完成后,元素将被重新排列,索引也会被重新赋值。

arrayName.remove(value)

计费示例:

import array
balance = array.array('i', [300, 200, 150, 100])
balance.remove(150)
print(balance)

输出:

array('i', [300, 200, 100])

搜索

此操作按值查找元素并返回其索引。它是一种非破坏性方法,因此不会更改数组值。

arrayName.index(value)

计费示例:

import array
balance = array.array('i', [300, 200, 150, 100])
print(balance.index(150))

输出:

2

更新

更新操作使用简单的赋值运算符替换给定索引处的现有值。Python 数组没有 update() 方法。)

arrayName[index] = value

计费示例: 将索引为 2 的 150 替换为 145:

import array
balance = array.array('i', [300, 200, 150, 100])
balance[2] = 145
print(balance)

输出:

array('i', [300, 200, 145, 100])

特拉弗斯

你可以遍历 Python 使用循环生成数组:

import array
balance = array.array('i', [300, 200, 100])
for x in balance:
    print(x)

输出:

300
200
100

在中创建数组 C++

C++ 比 Python 创建数组时,您可以创建 C++ 数组 有三种方法。以下代码创建一个整数数组。 C++ 存储账户余额:

#include <iostream>
using namespace std;

int main()
{
  int balance[3] = { 300, 200, 100 };
  for (int i = 0; i < 3; i++)
    {
      cout << "value of i: " << balance[i] << endl;
    }
  return 0;
}

声明数组的方法 C++

根据程序的需求,你可以通过三种方式声明数组。

按尺寸声明:

dataType arrayName[arraySize];   // e.g. int balance[3];

仅包含数组元素的声明:

dataType arrayName[] = {array_items};   // e.g. int balance[] = { 300, 200, 100 };

按尺寸和物品申报:

dataType arrayName[arraySize] = {array_items};   // e.g. int balance[3] = { 300, 200, 100 };

如何在数组中访问特定值 C++?

访问数组元素

访问数组元素

#include <iostream>
using namespace std;

int main()
{
  int balance[3] = { 300, 200, 100 };
  cout << balance[1];
  return 0;
}

输出:

200

排列 Opera在 C++

不比 Python在 C++ 您必须自行编写插入、删除、搜索、更新和遍历操作的逻辑。

插页

插入逻辑如下:遍历数组元素,将它们向更大的索引位置移动,然后在指定的索引位置添加新元素。下面的示例包含五个元素,并在值 200 之后插入 150。

#include <iostream>
#include <stdio.h>

main() {
   int pos = 2;
   int size = 4;
   int balance[] = {300, 200, 100, 50, 0};

   printf("BEFORE INSERT:\n");
   for(int i = 0; i < 5; i++) {
      printf("%d\n", balance[i]);
   }

   /* SHIFT ITEMS TO A GREATER INDEX */
   for(int i = size; i >= pos; i--) {
       balance[i+1] = balance[i];
   }

   /* INSERT VALUE AT THE DESIRED INDEX */
   balance[pos] = 150;

   printf("AFTER INSERT:\n");
   for(int i = 0; i < 6; i++) {
      printf("%d\n", balance[i]);
   }
}

排列 Opera在 Java

让我们创建一个程序 Java 它接受用户提供的数组元素的大小和值。

import java.util.Scanner;

public class AddElements {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        System.out.println("Enter the size of the array");
        int n = sc.nextInt();

        int arr[] = new int[n];

        System.out.println("Enter Elements in the array");
        for(int i = 0; i < n; i++) {
            arr[i] = sc.nextInt();
        }
        System.out.println("Elements in the array");
        for(int j = 0; j < n; j++) {
            System.out.print(arr[j] + " ");
        }
    }
}

修改元素 Java 排列

根据索引更新元素。

import java.util.Scanner;

public class ModifyElement {
    public static void main(String[] args) {
        int arr[] = {1, 2, 3, 4, 5};
        int length = arr.length;
        Scanner sc = new Scanner(System.in);

        System.out.println("Array Elements Before modify");
        for(int i = 0; i < length; i++) {
            System.out.print(arr[i] + " ");
        }

        System.out.println("\nEnter the position to change");
        int pos = sc.nextInt();
        System.out.println("Enter the value");
        int val = sc.nextInt();

        arr[pos] = val;

        System.out.println("Array Elements After modify");
        for(int j = 0; j < length; j++) {
            System.out.print(arr[j] + " ");
        }
    }
}

访问元素 Java 排列

通过遍历数组打印所有数组元素。

public class AccessElements {
    public static void main(String[] args) {
        int arr[] = {1, 2, 3, 4, 5};
        int length = arr.length;

        System.out.println("Array Elements are:-");
        for(int i = 0; i < length; i++) {
            System.out.print(arr[i] + " ");
        }
    }
}

常见问题

数组是将相同数据类型的元素存储在连续内存位置的集合。每个元素都通过索引访问,这使得数组非常适合存储和检索多个相关值。

A Python 列表可以容纳不同数据类型的元素,而数组(来自数组模块)则只能容纳单一数据类型的元素。对于大型数值数据集,数组更节省内存。

五种基本操作是插入(添加项目)、删除(移除项目)、搜索(按值查找项目)、更新(更改索引处的值)和遍历(访问每个元素)。

通过索引访问元素的时间复杂度为 O(1),即常数时间,因为内存地址可以直接由基地址和索引计算得出。插入和删除操作的时间复杂度为 O(n),这是由于需要进行移位运算。

连续存储使得程序能够根据基地址加上索引乘以元素大小,立即计算出任何元素的地址。这正是数组能够实现快速、恒定时间随机访问的原因。

Python 需要数组模块并提供内置操作方法。 C++ 和 Java 支持原生声明数组,但需要自行编写插入、删除和搜索逻辑。 Java 数组也公开了一个 length 属性。

数组是人工智能中使用的向量、矩阵和张量的基础。像 NumPy 和 TensorFlow 这样的库将训练数据和模型权重存储为多维数组,以实现快速的数值计算。

是的。AI 编码助手可以检测差一错误和越界索引错误,提供修复建议,并解释为什么索引超出了数组长度。ping 初学者可以快速解决常见的数组错误。

总结一下这篇文章: