首页
学习
活动
专区
圈层
工具
发布

【从0到1学算法】 数组和链表

当需要存储多项数据时,会用到两种基本方式---数组和链表 假设你要编写一个管理待办事项的应用,需要将这些待办事项存储到内存中,用数组还是链表?...索引 使用数组和链表存储数据,我们都会给元素编号,编号从0开始,这些元素的编号位置成为索引。 例如,下面的数组,元素20在索引1处 ?...链表-顺序访问 而链表呢?元素是分开存储的,无法推算出任意位置元素的地址,不支持随机访问,只能顺序访问(从第一个元素开始逐个读取元素)。...所以,当需要随机访问,数组是更好的选择。 插入元素 数组插入数据,必须将后面的元素后移(保持顺序存储),且有可能出现连续内存不足,这就得将整个数组复制到其他地方 例如,插入“卖茶叶”到第3个位置 ?...读取多,插入少,用数组。 读取少,插入多,用链表。 但在实际应用中,数组用的更多一,因为它支持随机读取。

68810

高效处理多维数组:einsum()函数从入门到精通

不过一旦掌握其基本原理,einsumAI写代码1将成为Python科学计算生态系统中处理多维数组运算最为优雅高效的工具之一。它不仅语法简洁,表达力强,而且在众多应用场景中通常比常规方法更具计算效率。...在NumPy中(后文将讨论其他框架如PyTorch、TensorFlow等),np.einsum()AI写代码1函数允许直接应用这种表示法进行数组操作。...np.einsum("ij,jk->ik", A, B)AI写代码123456该操作等效于np.dot(A, B)AI写代码1或A @ BAI写代码1,但einsum()AI写代码1的真正价值在于它能够将这一原理推广到更复杂的多维张量运算...2、理解基本的 einsum() 语法einsum()函数的语法初见时可能显得复杂,但一旦理解其逻辑,您会发现它是一个极为强大的数组操作工具。...提取对角线从方阵提取对角线元素是一个典型的单输入操作示例。矩阵的对角线是指从左上角到右下角的元素集合。图7:einsum()AI写代码1表示的对角线提取操作。

68120
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    高效处理多维数组:einsum()函数从入门到精通

    不过一旦掌握其基本原理,einsum将成为Python科学计算生态系统中处理多维数组运算最为优雅高效的工具之一。它不仅语法简洁,表达力强,而且在众多应用场景中通常比常规方法更具计算效率。...在NumPy中(后文将讨论其他框架如PyTorch、TensorFlow等),np.einsum()函数允许直接应用这种表示法进行数组操作。...C=np.einsum("ij,jk->ik", A, B) 该操作等效于np.dot(A, B)或A @ B,但einsum()的真正价值在于它能够将这一原理推广到更复杂的多维张量运算,这正是本文将要深入探讨的内容...2、理解基本的 einsum() 语法 einsum()函数的语法初见时可能显得复杂,但一旦理解其逻辑,您会发现它是一个极为强大的数组操作工具。...提取对角线 从方阵提取对角线元素是一个典型的单输入操作示例。矩阵的对角线是指从左上角到右下角的元素集合。 图7:einsum()表示的对角线提取操作。

    51910

    c语言从入门到实战——数组指针与函数指针

    数组指针与函数指针 前言 数组指针和函数指针都是指针类型,但是它们指向不同的数据类型。 数组指针:数组指针指向的是数组类型。 函数指针:函数指针指向的是函数类型。...数组指针和函数指针是C语言中的两种重要指针类型。数组指针指向一个数组,可以用来访问和修改数组中的元素;而函数指针则指向一个函数,可以用来调用该函数。两者在语法和用法上有所不同,需要仔细区分。...C/C++会把常量字符串存储到单独的一个内存区域,当几个指针指向同一个字符串的时候,他们实际会指向同一块内存。但是用相同的常量字符串去初始化不同的数组的时候就会开辟出不同的内存块。...如果我们要将函数的地址存放起来,就得创建函数指针变量咯,函数指针变量的写法其实和数组指针非常类似。...函数指针数组 数组是一个存放相同类型数据的存储空间,我们已经学习了指针数组, 比如: int *arr[10]; //数组的每个元素是int* 那要把函数的地址存到一个数组中,那这个数组就叫函数指针数组

    43210

    fread函数_fread读取数据到数组

    文章迁移: fread函数详解 – 码到城攻fread函数详解,C函数使用注意事项,fread https://www.codecomeon.com/posts/93/ 函数原型: size_t...*buffer, size_t size, size_t count, FILE *stream ) buffer 是读取的数据存放的内存的指针(可以是数组...buffer就是一个索引) size 是每次读取的字节数 count 是读取次数 strean 是要读取的文件的指针 例如 从文件...这就是因为字符方式用特定的标记结尾的,读取时只要碰到该标记就自动结束 函数fread()读取[num]个对象(每个对象大小为size(大小)指定的字节数),并把它们替换到由buffer(缓冲区)指定的数组...函数的返回值是读取的内容数量… 使用feof()或ferror()判断到底发生哪个错误.

    1.4K30

    数组与链表

    面试问题:数组与链表主要区别 链表适合插入、删除,时间复杂度是O(1),而数组支持随机访问,根据下表随机访问的时间复杂度为O(1); 链表 什么是链表 数组需要连续的储存空间,而链表不需要连续的存储空间...Java中的LinkedHashMap就采用双向链表数据结构 数组与链表区别 数组简单易用,在实现上使用的是连续的内存空间,可以借助 CPU 的缓存机制,预读数组中的数据,所以访问效率更高。...这时只能再申请一个更大的内存空间,把原数组拷贝进去,非常费时; 链表本身没有大小的限制,并且支持动态扩容; 单链表操作 反转 方法一:递归反转法,在反转当前节点之前先反转后续节点。...简单的说就是从尾结点开始,逆向反转各个结点的指针域指向。...:A->B->C->D->B->C->D, 当遍历到节点D的时候,我们需要比较的是之前的节点A、B、C,不存在相同节点。

    74320

    数组和链表

    区别于数组,链表中的元素不是存储在内存中连续的一片区域,链表中的数据存储在每一个称之为「结点」复合区域里,在每一个结点除了存储数据以外,还保存了到下一个节点的指针(Pointer)。...与数组不同,我们不需要将所有元素移动到插入元素之后。因此,您可以在 O(1) 时间复杂度中将新结点插入到链表中,这非常高效。...# 单链表删除 如果我们想从单链表中删除现有结点 cur ,可以分两步完成: (1)找到 cur 的上一个结点 prev 及其下一个结点 next ; (2)接下来链接 prev 到 cur 的下一个节点...new ListNode(value, null); newNode.next = this.head.next; this.head.next = newNode; } (2)从尾部添加节点...newNode.next = this.head.next; this.head.next = newNode; newNode.prev = this.head; } (2)从尾部添加节点

    86720

    数组和链表

    这时候,该应用数组还是链表呢? 数组 鉴于数组比较容易理解,我们先将待办事项存储于数组中。使用数组就意味着所有的待办事项在内存中的存储都是紧密相连的。 假设我们要存储 4 个待办事项。...这就是数组的弊端。 链表 可以用链表来解决以上数组的弊端。链表中的任何元素可以存储在计算机内存中的任何地方。然后链表的每个元素都存储了下一个元素的地址,从而使一系列随机的内存地址串联了起来。...在链表中添加元素很方便:只需要将其放入内存,并将其地址存储到前一个元素中既可。 链表的优势体现在添加新元素方面,我们看看其他方面数组和链表会有怎样的优势与劣势。...总结 用大 O 表示法来总结一下数组和链表各种情况的运行时间: O(1) : 常量时间 , O(n) :线性时间 数组 链表 插入 O(n) O(1) 读取 O(1) O(n) 删除 O(n)...O(1) 数组和链表相比,数组用的比较多,因为很多情况需要支持随机访问,而链表仅支持顺序访问。

    72620

    数组和链表

    写在前面: 数组和链表是数据结构中最基础的两种结构,其他的都是由这两者转化而来; 因此,掌握这两种结构至关重要!下面,时光就带大家来学习一下数组和链表; 思维导图: ? 1,什么是线性表?...因为数组和链表都是线性表的结构,只不过它们的存储方式不一样; 根据存储方式不同,可将线性表分为顺序表和链式表; 线性表是数据结构中的逻辑结构。可以存储在数组上,也可以存储在链表上。...一句话,用数组来存储的线性表就是顺序表。 2,数组和链表 数组:在内存中,是一块连续的内存区域; 链表:是由不连续的内存空间组成; ?...(每一个数据存储了下一个数据的地址,增删效率高) 链表的缺点:不能随机查找,必须从第一个开始遍历,查找效率低 4,数组和链表的代码实现 说了这么多,让我们用代码来写一个数组和链表。...[] data; 9 //顺序表的长度,用来标识数组中的元素个数 10 public int size; 11 12 //构造函数 13 public DynamicArray

    78820

    数据结构从入门到精通——链表

    例如,链表可以作为栈的底层数据结构,实现元素的先进后出。此外,链表还可以用于实现动态数组,支持元素的动态插入和删除。 总之,链表作为一种重要的数据结构,在编程和数据处理中发挥着重要作用。...比如:陪女朋友到操作跑步减肥。 【扩展问题】 为什么快指针每次走两步,慢指针走一步可以? 假设链表带环,两个指针最后都会进入环,快指针先进环,慢指针后进环。...如果链表无环,则返回 NULL 解决像这样的题目,我们可以找等式,通过等式来找出相应的关系 结论 让一个指针从链表起始位置开始遍历链表,同时让一个指针从判环时相遇点的位置开始绕环运行,两个指针都是每次均走一步...这个过程可以通过设置一个指针,初始时指向链表的头节点,然后不断将指针移动到下一个节点,直到指针为空,即遍历完整个链表。 为了实现单链表的打印,我们可以定义一个函数,该函数接受链表的头节点作为参数。...在遍历过程中,我们需要逐个访问链表中的每个节点,并释放其内存。这通常通过调用适当的内存释放函数来完成,例如在C++中使用delete操作符,或在C语言中使用free函数。

    1.1K11

    c语言从入门到实战——数组

    3.1 数组下标 C语言规定数组是有下标的,下标是从0开始的,假设数组有n个元素,最后一个元素的下标是n-1,下标就相当于数组元素的编号,如下: int arr[10] = {1,2,3,4,5,6,7,8,9,10...10个元素 除此之外我们还可以使用strlen()函数,strlen()函数是包含在string.h头文件里的库函数,在使用前需要引用头文件。...C语言规定,二维数组的行是从0开始的,列也是从0开始的,如下所示: int arr[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7}; 图中最右侧绿色的数字表示行号...,第一行蓝色的数字表示列号,都是从0开始的,比如,我们说:第2 行,第4列,快速就能定位出7。...数组练习 练习1:多个字符从两端移动,向中间汇聚 编写代码,演示多个字符从两端移动,向中间汇聚 #include #include //strlen函数 #include

    99010

    C语言数组:从入门到进阶

    前言: 在这篇博客中,我们将学习如何使用C语言数组的基本知识。数组是C语言中的一种重要数据结构,它允许我们存储一系列相同类型的数据。我们将讨论数组的定义、初始化、访问元素、遍历数组以及数组的应用场景。...此外,我们还将通过一些代码示例来加深对数组的理解。 一、数组的定义和声明 在C语言中,数组的定义和声明是分开的。定义数组时,我们需要指定数组的类型和大小。声明数组时,我们只需要指定数组的类型和名称。...以下是数组的定义和声明的语法: 数据类型 数组名[数组大小]; 例如,我们可以定义一个包含5个整数的数组: int numbers[5]; 二、数组的初始化 在定义数组后,我们可以为数组的元素赋初值。...数组的索引从0开始,因此数组的第一个元素对应索引0,第二个元素对应索引1,以此类推。...多维数组是数组的数组,可以用于表示矩阵等复杂的数据结构。

    58010

    c语言:从指针到指针数组

    printf("%d,%d\n", a, b); swap2(&a, &b); printf("%d,%d\n", a, b); return 0; } 像这样,我们把a与b的地址当做是实参,传递到形参指针变量里面...与一维数组传参形参用指针接收一样,那二维数组传参就也可以用数组指针来接收。 4、函数指针变量与函数指针数组 根据前面的一系列数组指针,整形指针,那我们不难推出,存储函数地址的指针,就是函数指针。...如果我们要将函数的地址存放起来,自然就得创建函数指针变量,函数指针变量的写法其实和数组指针非常类似。...了解了函数指针类型,那么函数指针数组自然就是存放一系列函数指针的数组,但这个数组的命名方式有所不同,并不是把数组名放在后面,如: //函数指针数组的声明: int(*arr[5])(); arr[ 5...函数指针变量和函数指针数组是C语言中强大而有用的工具。它们允许我们动态地选择要执行的函数,并将函数作为参数传递给其他函数。

    14110

    算法 - 数组和链表

    原文 极客时间 - 数据结构与算法之美 - 05 | 数组 极客时间 - 数据结构与算法之美 - 06 | 链表(上) 极客时间 - 数据结构与算法之美 - 07 | 链表(下) 数组 数组(Array...一维数组内存寻址公式: 对于二维数组 a[n] a[i]_addr = base_addr + i * type_size 二维数组内存寻址公式: 对于二维数组 a[m][n] a[i][j]_addr...用单链表实现LRU 维护一个有序单链表,越靠近链表尾部的结点是越早之前访问的。当有一个新的数据被访问时,我们从链表头开始顺序遍历链表。...如果此数据之前已经被缓存在链表中了,我们遍历得到这个数据对应的结点,并将其从原来的位置删除,然后再插入到链表的头部。...如果此数据没有在缓存链表中,又可以分为两种情况: 如果此时缓存未满,则将此结点直接插入到链表的头部; 如果此时缓存已满,则链表尾结点删除,将新的数据结点插入链表的的头部; 写好链表代码 技巧一:理解指针或引用的含义

    84730

    数组和链表总结

    定义 数组是具有相同数据类型的元素的集合 链表是由链接/指针连接的元素的有序集合 访问方式 在数组中,可以使用索引/下标值来访问元素,即元素可以被随机访问,比如arr[0]、arr[3]等...在链表中,元素不能随机访问,只能按顺序访问,访问元素需要花费O(n)时间 内存结构 在数组中,元素以连续的方式存储在内存中 在链表中,元素可以存储在任何可用的地方,节点的地址存储在以前的节点中...插入&删除 因为元素存储在连续的内存位置,在数组中插入和删除需要更多的时间,每次操作都需要移动元素 插入和删除在链表中是快速和容易的,因为只需要改变指针的值 内存分配 在数组中,在编译时分配内存...,即静态内存分配 在链表中,内存在运行时分配,即动态内存分配 类型 数组可以是单维的,二维的或多维的 链表可以是单端链表、双端链表或循环链表 依赖性 在数组中,每个元素都是独立的...,与以前的元素或位置无关 在链表中,元素的位置或地址存储在前一个元素/节点的链接部分 额外空间 在数组中,没有使用类似链表的指针,因此不需要内存中的额外空间来存放指针 在链表中,元素之间使用指针或链接来维护

    66230

    LeetCode链表问题全解析:从基础到进阶

    一、链表基础与核心概念 1.1 链表的数据结构定义 链表是一种常见的线性数据结构,与数组不同,链表中的元素在内存中不是连续存储的,而是通过指针连接起来的。...优点: 插入和删除操作效率高,不需要移动元素,只需修改指针,时间复杂度为O(1) 不需要预先分配固定大小的内存空间 缺点: 不能像数组那样进行随机访问,访问特定位置的元素需要从头开始遍历,时间复杂度为...三、链表进阶问题 3.1 合并K个升序链表(LeetCode 23) 题目描述:给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表。...每次从堆中取出和插入元素的时间复杂度是O(log K),总共进行N次这样的操作。 空间复杂度:O(K),堆中最多存储K个节点。...六、链表思维训练与扩展 6.1 链表与其他数据结构的结合 链表+哈希表:解决随机指针复制、相交链表等问题 链表+优先队列:解决合并K个有序链表等问题 链表+栈:解决回文链表、逆序输出等问题 6.2 链表在实际应用中的体现

    16810
    领券