数据结构

数据结构 一、说明 数据结构是计算机科学中一个非常基础和核心的概念,它对于编程、算法设计和软件工程都至关重要。 简单来说,数据结构是一种在计算机中组织、管理和存储数据的方式,目的是为了实现高效地访问和修改。 可以把它想象成一个储物系统: 把一堆书随便堆在地上,这是一种“存储”,但找起来非常困难。 使用一个带标签的书架,把书分门别类地放好,找书、放书就高效得多。 这个“书架”以及“如何给书分类、摆放”的规则,就是一种“数据结构”。 为什么数据结构如此重要? 选择合适的数据结构可以极大地影响程序的性能和效率。一个精心选择的数据结构可以让操作(如搜索、插入、删除)变得非常快;而错误的选择则可能导致程序运行缓慢甚至崩溃。 二、 常见的数据结构分类和类型 数据结构主要可以分为两大类:线性结构和非线性结构。 一、 线性数据结构 元素按顺序排列,形成一条“线”。 数组:在内存中连续存储相同类型的元素。通过索引可以快速访问任意元素。 优点:随机访问速度快。 缺点:大小固定(在某些语言中),插入和删除元素效率低。 链表:由一系列节点组成,每个节点包含数据和指向下一个节点的指针。 优点:大小动态,插入和删除元素效率高。 缺点:不能随机访问,必须从头开始遍历。 栈:一种后进先出的结构,像一摞盘子。只能在顶部进行添加(压栈)和移除(弹栈)操作。 应用:函数调用栈、撤销操作、表达式求值。 队列:一种先进先出的结构,像排队一样。从队尾添加元素,从队首移除元素。 应用:任务调度、消息队列、广度优先搜索。 变种:双端队列、优先队列。 二、 非线性数据结构 元素之间不是简单的前后关系,可能存在多个连接。 树:一种分层结构,由节点和边组成。最顶端的节点叫根节点。 二叉树:每个节点最多有两个子节点。 二叉搜索树:左子树所有节点的值小于根节点,右子树所有节点的值大于根节点。这使得搜索非常高效。 应用:文件系统、数据库索引、决策树。 图:由顶点和连接顶点的边组成。可以表示任意复杂的关系网络。 应用:社交网络、地图导航、网络路由。 哈希表:通过一个哈希函数将键映射到一个位置来访问记录,以实现极快的查找速度。 优点:在平均情况下,插入、删除和查找的时间复杂度都是 O(1)。 应用:字典、集合、缓存。 三、核心操作与算法 对于每种数据结构,我们通常关心以下几个核心操作的效率: 访问 搜索 插入 删除 这些操作的效率通常用 大O表示法 来衡量,它描述了算法时间或空间复杂度随数据规模增长的趋势。 四、作用 数据结构是构建高效算法的基石。学习数据结构能帮助你: 写出更高效的代码:理解不同操作的代价。 解决复杂问题:很多复杂问题本质上就是数据组织和处理的问题。 更好地理解计算机系统:从内存管理到数据库,底层都离不开数据结构。

March 12, 2023 · 1 min · Leanku

算法

算法 算法是计算机科学的核心基础之一,简单来说它是解决特定问题的一系列清晰指令。无论是简单的计算还是复杂的人工智能任务,都离不开算法。 1. 算法是什么? 你可以把算法想象成一个菜谱: 输入:食材(数据) 处理步骤:清晰的烹饪步骤(算法逻辑) 输出:一道菜肴(结果) 它的核心目标是用最优的方式(最快、最省资源)解决问题。 2. 算法的核心特性 一个“好”的算法通常具备以下特点: 正确性:必须能正确解决问题。 高效性:执行时间和占用空间要尽可能少。 明确性:每一步都必须清晰、无歧义。 有限性:必须在有限的步骤内结束。 3. 常见的算法类别与实例 算法种类繁多,以下是一些主要类别和经典例子: 排序算法 快速排序:采用“分治”思想,选择一个基准元素,将数组分成左右两部分,效率很高。 归并排序:也是“分治”思想,先将数组不断拆分,再合并排序,稳定且高效。 冒泡排序:反复交换相邻的逆序元素,简单但效率低。 搜索算法 二分查找:在已排序的数组中,每次比较都能排除一半的数据,效率极高(O(log n))。 深度优先搜索和广度优先搜索:用于遍历或搜索树和图结构,是许多复杂算法的基础。 图算法 Dijkstra算法:用于寻找图中两点之间的最短路径。 A*搜索算法:在Dijkstra基础上加入了启发式函数,是路径规划和游戏AI的基石。 动态规划 用于解决具有重叠子问题和最优子结构的复杂问题(如斐波那契数列、背包问题),通过存储中间结果来避免重复计算。 机器学习算法(AI领域) 线性回归/逻辑回归:用于预测和分类。 决策树/随机森林:通过树形结构做决策。 支持向量机:寻找最佳分类边界。 神经网络:模仿人脑神经元,是深度学习的核心。 4. 如何衡量算法的好坏?—— “复杂度分析” 我们使用 “大O表示法” 来描述算法的效率,主要看: 时间复杂度:随着数据规模增大,算法运行时间的增长趋势。例如 O(1), O(log n), O(n), O(n²)。 空间复杂度:随着数据规模增大,算法占用内存空间的增长趋势。 5. 为什么算法如此重要? 效率:好的算法能处理海量数据,差的算法在大数据面前寸步难行。 性能:直接影响软件和应用的反应速度与用户体验。 解决问题的基础:是开发任何软件系统、进行科学计算和实现人工智能的基石。 面试核心:是国内外大型科技公司技术面试的必考内容。

March 12, 2023 · 1 min · Leanku

我步入丛林

我步入丛林,因为我希望生活的有意义,我希望活的深刻。汲取生命中所有的精华,把非生命的一切都击溃,以免让我在生命终结时,发现自己从来没有活过! I went to the woods because I wanted to live deliberately. I wanted to live deep and suck out all the marrow of life!To put to rout allthat was not life, and not, when I had come to die, discover that I had not lived. 推荐电影《死亡诗社》 原文出自 《瓦尔登湖》-亨利·戴维·梭罗

March 12, 2023 · 1 min · Leanku

记录一些句子

记录一些句子 你是否也曾被一句话深深触动?还记得吗? 生活 刀枪入库,马放南山。- 清代.钱彩.《说岳全传》 先去你的塞外,再回我的江南。 -金庸.《天龙八部》 小舟从此逝,江海寄余生。 - 《临江仙·夜饮东坡醒复醉》 行到水穷处,坐看云起时。 - 《终南别业》 道 上善若水,水利万物而不争。 - 《道德经》 朝闻道,夕死可矣。 ——《论语·里仁》 天下同归而殊途,一致而百虑。 ——《易经·系辞下》 大方无隅,大器晚成,大音希声,大象无形。 - 《道德经》 为天地立心,为生民立命,为往圣继绝学,为万世开太平。 - 《横渠语录》 相濡以沫,不如相忘于江湖。 - 《庄子》 苟日新,日日新,又日新。 - 《大学》 慎终如始,则无败事。 - 《道德经》 为者常成,行者常至。 - 《晏子春秋》 一念起天涯咫尺,一念灭咫尺天涯。

March 12, 2023 · 1 min · Leanku

docker删除none镜像

docker删除none镜像 1、使用git bash进入到docker文件夹 2、查询所有的none镜像 docker images | grep none 3、查询所有的none镜像的id docker images | grep none | awk '{print $3}' 4、删除所有的none镜像 docker images | grep none | awk '{print $3}' | xargs docker rmi docker none镜像说明 一、有效的 none 镜像 Docker文件系统的组成,docker镜像是由很多 layers组成的,每个 layer之间有父子关系,所有的docker文件系统层默认都存储在/var/lib/docker/graph目录下,docker称之为图层数据库。 最后做一个总结< none>:< none> 镜像是一种中间镜像,我们可以使用docker images -a来看到,他们不会造成硬盘空间占用的问题(因为这是镜像的父层,必须存在的),但是会给我们的判断带来迷惑。 二、无效的 none 镜像 另一种类型的 < none>:< none> 镜像是dangling images ,这种类型会造成磁盘空间占用问题。 像Java和Golang这种编程语言都有一个内存区,这个内存区不会关联任何的代码。这些语言的垃圾回收系统优先回收这块区域的空间,将他返回给堆内存,所以这块内存区对于之后的内存分配是有用的 docker的悬挂(dangling)文件系统与上面的原理类似,他是没有被使用到的并且不会关联任何镜像,因此我们需要一种机制去清理这些悬空镜像。 我们在上文已经提到了有效的< none>镜像,他们是一种中间层,那无效的< none>镜像又是怎么出现的?这些 dangling镜像主要是我们触发 docker build 和 docker pull命令产生的。 使用下面的命令可以清理 docker rmi $(docker images -f "dangling=true" -q)

March 11, 2023 · 1 min · Leanku

php-msf-docker

php-msf-docker 基于centos:centos7.9.2009镜像制作的php开发环境镜像 主要包含: PHP-8.1.14 redis-5.3.7 swoole-src-5.0.2 nginx-1.21.5 supervisor sshd GitHub地址 : https://hub.docker.com/r/leanku/php-msf-docker DockerHub地址 : https://hub.docker.com/r/leanku/php-msf-docker 包含扩展 bcmath,Core,ctype,curl,date,dom,exif,fileinfo,filter,ftp,gd,gettext,hash,iconv,intl,json,libxml,mbstring,mysqli,mysqlnd,openssl,pcntl,pcre,PDO,pdo_mysql,pdo_pgsql,pdo_sqlite,pgsql,Phar,posix,redis,Reflection,session,shmop,SimpleXML,soap,sockets,sodium,SPL,sqlite3,standard,sysvsem,tokenizer,xml,xmlreader,xmlwriter,xsl,zip,zlib,swoole 运行示例 docker run --privileged --restart=always -it -d \ --hostname=php-msf --name=php-msf-docker \ -p 22:22 -p 80:80 -p 3306:3306 -p 8000:8000 -p 9501:9501 \ -v /c/docker/www:/php-msf/data/www \ leanku/php-msf-docker SSH 默认用户:super 密码:123456 ssh super@127.0.0.1

March 11, 2023 · 1 min · Leanku

行有余力,则以学文

子曰:弟子入则孝,出则弟,谨而信,泛爱众,而亲仁,行有余力,则以学文。 孔子说:“弟子们在父母跟前,就孝顺父母;出门在外,顺从师长,言行要谨慎,要诚实可信,寡言少语,要广泛地去爱众人,亲近那些有仁德的人。这样躬行实践之后,还有余力的话,就再去学习文献知识。” 《论语·学而篇》- 孔子

March 9, 2023 · 1 min · Leanku

PHP位运算使用

PHP 位运算介绍 位运算符允许对整型数中指定的位进行求值和操作。 以下是官网的一个介绍。 例子 名称 结果 $a & $b And(按位与) 将把 $a 和 $b 中都为 1 的位设为 1。 $a | $b Or(按位或) 将把 $a 和 $b 中任何一个为 1 的位设为 1。 $a ^ $b Xor(按位异或) 将把 $a 和 $b 中一个为 1 另一个为 0 的位设为 1。 ~ $a Not(按位取反) 将 $a 中为 0 的位设为 1,反之亦然。 $a « $b Shift left(左移) 将 $a 中的位向左移动 $b 次(每一次移动都表示 “乘以 2”)。 $a » $b Shift right(右移) 将 $a 中的位向右移动 $b 次(每一次移动都表示 “除以 2”)。 详情请点击这里了解。 平常开发需要用位运算吗? 位运算符都是针对整数的二进制数字形式而进行的。...

February 28, 2023 · 1 min · Leanku

Git创建不继承内容的新分支

Git创建不继承内容的新分支方法 在 Git 中,想创建一个新的分支,并且不想要当前分支的任何内容(即希望新分支是完全干净的,不包含当前分支的修改或提交),可以按照以下步骤操作: 方法 1:基于远程默认分支(如 main/master)创建新分支 如果你希望新分支是基于远程仓库的默认分支(而不是当前分支),可以这样做: ``` # 1. 确保本地没有未提交的修改(否则会提示你提交或暂存) git status # 2. 拉取远程最新代码(确保本地默认分支是最新的) git fetch origin # 3. 基于远程默认分支(如 origin/main)创建新分支 git checkout -b 新分支名 origin/main 方法 2:基于某个提交或分支创建全新分支 如果你想基于某个特定的提交(而不是当前分支)创建新分支: ``` # 1. 先切换到目标分支或提交(例如切换到 main 分支) git checkout main # 2. 拉取最新代码(可选) git pull origin main # 3. 创建并切换到新分支 git checkout -b 新分支名 方法 3:强制创建孤立分支(完全无历史) 如果你想创建一个完全独立的新分支(不继承任何历史): 在切换分支之前,确保你没有未提交的修改,否则 Git 可能会尝试携带这些修改到新分支: git status # 提交他们 git add . git commit -m "暂存当前修改" # 或者丢弃它们 git reset --hard # 强制丢弃所有未提交的修改 创建一个完全独立的新分支(不继承任何历史)...

February 26, 2023 · 1 min · Leanku

Git历史重置

Git历史重置 有时候需要克隆github的项目使用,自己进行修改需要提交到自己的代码仓库,但是会包含前仓库的大量提交历史,看起来不方便,就需要清理历史记录并重置为一个全新的提交 新项目(如git clone 的项目) # 进入项目目录 cd template-repo-master # 删除原有的.git目录(如果存在)初始化全新的Git仓库 rm -rf .git git init git add . git commit -m "Initial commit from template" git remote add origin git@github.com:your-username/your-new-repo.git git push -u origin master --force 已经将代码推送到自己的远程仓库 清理历史记录并重置为一个全新的提交 # 1. 克隆你的远程仓库(可选) git clone git@github.com:your-username/your-repo.git cd your-repo # 2.创建孤立分支(全新的历史起点) git checkout --orphan new-branch # 3. 添加所有文件到新分支 git add -A git commit -m "Initial commit (cleaned history)" #4. 删除旧的主分支 git branch -D master # 或 main # 5....

February 26, 2023 · 1 min · Leanku