영어
每周最少一更,求 Out题,求虐待 일주일에 한 번 이상 문제와 학대를 요청하십시오.
├──Package │ ├── Sort 排序篇 │ │ ├── BubbleSort.php 冒泡排序 │ │ ├── HeapSort.php 堆排序 大根堆 │ │ ├── MBaseSort.php 基数排序 MSD │ │ ├── LBaseSort.php 基数排序 LSD │ │ ├── QuickSort.php 快速排序 │ │ ├── ShuttleSort.php 飞梭排序 │ │ ├── ShellSort.php 希尔排序 │ │ ├── MergeSort.php 归并排序 │ │ ├── InsertSort.php 插入排序 │ │ └── SelectSort.php 选择排序 │ │ │ ├── Query 查找篇 │ │ ├── BinaryQuery.php 二分查找 │ │ ├── InseertQuery.php 插入查找 │ │ ├── FibonacciQuery.php 斐波那契查找 │ │ ├── BFSQuery.php 广度优先查找 │ ├── Kmp.php 算法导论-KMP算法 │ ├── DijkstraQuery.php 迪克斯特拉算法 │ │ └── QulickQuery.php 快速查找 │ │ │ ├── Structure 数据结构 │ │ ├── StackExample.php 堆栈 先进后出 LIFO (Last In First Out) │ │ ├── LinearChain.php 线性表 单链存储 │ │ └── LinearOrder.php 线性表 顺序存储 │ │ └── BinarySearchTree.php 二叉搜索树 │ │ │ ├── Tools 小工具集 │ │ └── SystemSwitch.php 堆栈实现进制转换 │ │ │ └── Other 其他 │ ├── MonkeyKing.php 约瑟夫环 │ ├── DynamicProgramming.php 动态规划 │ ├── Fibonacci.php 斐波那契数列 │ ├── StealingApples.php 偷苹果求余 │ ├── HanoiGames.php 汉诺塔游戏 │ ├── BidirectionalQueue.php 双向队列 │ ├── ColorBricks.php 彩色砖块 │ ├── GetCattle.php 牛年求牛 │ ├── OnlyNumbers.php 求唯一数 │ ├── PokerGames.php 洗扑克牌 │ ├── Interval.php 抽奖区间算法 │ ├── Maze.php 迷宫寻址算法 │ ├── AntsClimb.php 蚂蚁爬杆算法 │ ├── Encryption.php 对称加密算法 │ ├── ElevatorDispatch.php 编程之美-电梯调度算法 │ ├── PointInTriangle.php 向量叉集计算点是否在三角形中 │ ├── TraversalOfBinary.php 二叉树非递归遍历算法实现 │ ├── Knapsack.php 贪心算法之背包问题实现 │ └── BigSmallReplace.php Hello World 输出 Olleh Dlrow │ └── Solution.php Facebook面试题之岛屿周长算法 │ └── RotationSort.php Facebook面试题之顺时针回旋算法 │ └── Square.php Facebook面试题之判断四个点能否组成正方形算法 │ └── Prim.php Prim算法(最小生成树算法) │ └── CartesianProduct.php 笛卡尔积算法 │ └── Square.php 面试题之平面任意四点能否组成一个矩形 │ └── Judge.php 面试题之扑克牌中任选五张判断是不是顺子 │ └── Factorial.php 面试题之N的阶乘末尾有多少个0 | └── HashTable.php HashTable | └── RotateSort.php 面试题之风车旋转排序算法 │ ├──LICENSE └──README.md
记录自己理解算法,数据结构的过程,尽可能的简单全面以及详细,让算法学习运用灵活自如,加油(ง •̀_•́)ง
用 PHP 实现算法并替代官方提供的函数是愚蠢的事情 .但这决不代表斟酌算法就是件无意义的事 , 每个算法都是一种思想的结晶 , 学习优秀的思想 , 开拓思维
直白地说,算法就是任何明确定义的计算过程,它接收一些值或集합작为输入,并产生一些值或集列计算过程。来源:Thomas H. Cormen, Chales E. Leiserson (2009), 《算法导论第三版》.
简而言之,저희는 们可以说算法就是用来解决一个特任务的一系列步骤(是的,不止计算机使效算法,人类也同样如此)。
它必须是는 매우 유용합니다.
它必须具备明确必须具备明确令:算法的每一步道必须准确义,任何场景下指令德应当没有歧义。
它必须是有效的:一个算法被设计用以解决某个问题,那么它就应当能解决这个问题, 并且仅仅使用纸와笔就能证明该算法是收敛的.
로그 10 100 相当于问"将多少个10 乘的结果为100",答案当然是2个了 因此log 10 100=2,即对数运算是幂运算的逆运算
왼쪽 | 오른쪽 |
---|---|
2 3 = 8 | 로그 2 8 = 3 |
2 4 = 16 | 로그 2 16 = 4 |
2 5 = 32 | 로그 2 32 = 5 |
以分查找为例,使用它可节省多少时间呢?简单查找逐个地检查数字,如果列表包含100个数字,最多需要猜100次。换而言之最多需要猜测的次数与列表长线性时间 (선형 시간), 而分查找则不同,如果列表包含100个元素7개의 다음 페이지에서 더 O(log)
大O表示法是一种特殊的表示法, 指了算法的速道多快.다양한 용도로 사용됩니다. 에서 这种情况下,知道这些算法的速道有快有慢
실제적인 이동 속도는 서로 같지 않습니다.
例如简单查找与 2分查找的区别
원素 | 简单查找 | 이분법 |
---|---|---|
100만 원 | 100ms | 7ms |
10000만 위안 | 10초 | 14ms |
1 000 000 000 만 원 | 11천 | 30ms |
大O
表示法指了算法多快,例如列表包含n
个元素,简单查找需要检查每个元素,因此需要执行n
次操使use大O
表示法这个运行时间为O(n)
, 2分查找需要执行log n次操作 ,使use大O
表示为O(log n)
一些常见的大O运行时间
O(log n) , 也叫对数时间, 这样的算法包括이분법
O(n), 也叫线性时间, 这样的算法包括简单查找.
O(n * log n) 快速排序
O(n 2 ),选择排序
O(n!) 即阶乘时间
这里是중병
算法的速島指的并不时间,而是操work数的增速
빠른 속도로 속도를 높이는 것이 좋습니다
算法的运行时间用大O表示法表示
O(log n)比O(n)快, 当需要搜索的需越多时,前者比后者快的越多
如何用数据题,即将问题抽象为一个数问题,即将问题抽象为一个数问题
问题所涉及到的数据议数据据据는 间的关系
如何에서 计算机中储存数据及体现数据之间的关系
处理数据时需要对数据执行的操work
编写 程序的性能是否良好
是客观事表示, 计算机科science中指的是所有能输入到计算机机被计算机程序处程序处程序处程符号的总称.
数据元素(데이터 요소) :是数数据的基本单位,程序中文常数据项 (데이터 항목) 组.
数据项(데이터 항목) : 是数据的不可分割的最小单位。数据项是对客观事물某一方剹性的数据描述。
数据对象(Data Object) :是性质上同的数据元素的集合, 是数据的一个子集.자세한 내용은 C={'A','B','C,…} 。
数据结构 : 互之间具는 하나의 정의된 数据元素的集합입니다.
数据的逻辑结构 : 数据逻辑结构.
数据操작품 : 对数据要进行的运算
数据类型(데이터 유형): 指的是一个值的集值集上的一组操总称.
集합:结构中数据원素 지间除了“属于同一个集합”외,再也没有其他的关系
线性结构: 结构中的数据元素存에서 一对一的关系
형태의 유형: 유형의 중앙 네트워크
더 많은 정보를 얻으세요
由数据机中에는 由数据机中의 间的关系가 서로 다른 방식으로 사용됩니다.——顺序表示화비顺序表示,从则导流两种储存方式,顺序储存结构和链式储存结构
顺序存储结构:사용数据数据逻辑结构(关系), 数据元素存放的地址是连续的
포인터 ,이용할 수 있는 逻辑结构(关系),数据元素存放的地址是否连续没有要求
数据적 逻辑结构화물리结构是密不可分的两个方面, 一个算法的设计取决于所选定的逻辑结构, 而算法的实现依赖于所采用存储结构
是对特序列, 其中每一条指令表示一个或多个操是对特序列, 其中每一条指令表示一个或多个操是对特序列, 步骤) 의 一种描述, 是指令列, 其中每一条指令表示一个或多个操work.
算法具有以下五个특성
소유성: 一个算法必须总是在执行有穷步之后结束,且每一步都在有穷时间内完成
确결정성: 算法中每一条指令必须有确切的含义,不存는 2개의 义性, 且算法只有一个入口 및 一个个只
실행성: 一个算法是能行的,即算法描述的操操作書可以通过已经实现的基本运算执行有限次来实现
输入: 一个算法有零个或多个输入,这些输入取自于某个特对象集합
输流: 一个算法有一个或多个输流, 这些输流是同输入有着某些特特系系的
算法과 程序是两个不同概念
一个计算机程序是对一个算法使用某种程序设计语言的具体实现입니다.
评价一个好的算法有以下几个标准
正确性(정확성): 算法应满足具体问题的需
可读性(가독성): 算法应容易供人阅读和交流,可读性好的算法有助于对算法的理解和修改
健壮性(견고함):算法应具有容错处理 ,当输入平 或错误数据时,算法应能适当地業流反应或进行处理,而不会产生莫name其妙的输流结果
공통적용성(일반): 算法应具有一般性 ,即算法的处理结果对于一般的数据集于成立
效率与存储weight需求:效率指的是算法执行的时间;存储weight需求指算法执行过程中所需要的最大存储空间,一般地,这两者与问题的规模有关
算法中基本操는 次数是问题规模n의 某个函数, 其时间weightness记模T를 작동시킵니다. (n)=O(f(n)), 작업 방식의 계산법(점근적) 시간 복잡도), 简称时间复杂島
是指算法编写成程序后, 에서 计算机中运行时所需存储储空间大存储模 ,记指算法编写成程序后, 记算 :S(n)=O(f(n)),其中n为问题规模
从程序上看,递归表现为自己调用自己,循环则没有这样的式式。
递归是从问题的最终目标发,逐渐将复杂问题化为简单问题,并且简单的问题的解决思路및复杂问题一样,同时存에서基准情况,就能最终求得问题,是逆向的。而循环是从简单问题出发,一步步的向前发展,最终求得问题,是正向的。
任归来表示的,但是想用循环来实现递归(除了单向递归和尾递归),city必须引入栈结构进行压栈流栈。
一般来说,不递归的效率高于递归。而且递归函数调用是有开销的,递归的次数受堆栈大小的限归。
내 idea
포크하세요
풀 리퀘스트
병합
如果大家发现有什么不对的地方,可以发起一个issue或自pull request,我会及时纠正
补充:发起풀 요청 커밋 메시지请参考文章커밋 메시지 와 변경 로그 编写指南
感谢以下朋友의 문제 또는 풀 요청:
우박
장쉬안루
아이프리섹
오픈셋
네록시에지
MIT