贪婪算法(贪心算法)是指在对问题进行求解时,在每一步选择中都采取最好或者最优(即最有 利)的选择,从而希望能够导致结果是最好或者最优的算法。 基本思路 其基本的解题思路为: 建立数学模型来描述问题 把求解的问题分成若干个子问题 对每一子问题求解,得到子问题的局部最优解 把子问题对应的局部最优解合成原来整个问题的一个近似最优解 贪婪算法所得到的结果往往不是最优的
本质就是树,用数组表示而已。 i的左子节点: 2 * i + 1 i的右子节点: 2 * i + 2 i的父节点: (i = 1) / 2最大堆的特点1.每个节点最多可以有两个节点 2.根节点的键值是所有堆节点键值中最大的,且每个结点的值都比其孩子的值大 3.除了根节点没有兄弟节点,最后一个左节点可以没有兄弟节点,其他节点必须有兄弟节点实现堆#include <iostream> /
一个装有 16 枚硬币的袋子,16 枚硬币中有一个是伪造的,伪造的硬币和普通硬币从表面上看不出有任何差别,但是那 个伪造的硬币比真的硬币要轻。现有给你一台天平,请你在尽可能最短的时间内找出那枚伪造的硬币 分治: 我们先将 16 枚硬币分为左右两个部分,各为 8 个硬币,分别称重,必然会有一半轻一半重,而我们要的就是轻的那组,重 的舍去。接下来我们继续对轻的进行五五分,直至每组剩下一枚或者两枚硬币
深度遍历邻接表的深度遍历 深度优先遍历思想: 首先以一个未被访问过的顶点作为起始顶点,沿当前顶点的边走到未访问过的顶点; 当没有未访问过的顶点时,则回到上一个顶点,继续试探别的顶点,直到所有的顶点都被访问过。#include "cstdio" #include "cstdlib" #define max_size 256 typedef struct _EdgeNode {
在计算机科学中,一个图就是一些顶点的集合,这些顶点通过一系列边结对(连接)。顶点用圆圈表示,边就 是这些圆圈之间的连线。顶点之间通过边连接。注意:顶点有时也称为节点或者交点,边有时也称为链接。 社交网络,每一个人就是一个顶点,互相认识的人之间通过边联系在一起, 边表示彼此的关系。这种关系可以 是单向的,也可以是双向的!简单实现#include <stdio.h> #include &l
散列表,它是基于快速存取的角度设计的,也是一种典型的“空间换时间”的做法 键(key): 组员的编号 如, 1 、 5 、 19 。 。 。 值(value): 组员的其它信息(包含 性别、年龄和战斗力等) 索引: 数组的下标(0,1,2,3,4) ,用以快速定位和检索数据 哈希桶: 保存索引的数组(链表或数组),数组成员为每一个索引值相同的多个元素 哈希函数: 将组员编号映射到索引上,采用求余
在高并发 HTTP 反向代理服务器 Nginx 中,存在着一个跟性能息息相关的模块 - 文件缓存 经常访问到的文件会被 nginx 从磁盘缓存到内存,这样可以极大的提高 Nginx 的并发能力,不过因为 内存的限制,当缓存的文件数达到一定程度的时候就会采取淘汰机制,优先淘汰进入时间比较久或是最近 访问很少(LRU)的队列文件。 具体实现方案: 使用双向循环队列保存缓存的文件节点,这样可以实现多种
树专业术语 中 文 描 述 Root 根节点 一棵树的顶点 Child 孩子节点 一个结点含有的子树的根结点称为该结点的子结点 Leaf 叶子节点 没有孩子的节点 Degree 度 一个节点包含的子树的数量 Edge 边 一个节点与另外一个节点的连接 Depth 深度 根节点到这个节点经过的边的数量 Height 节点高度 从当前节点到叶子节点形成路径中边的数量 Level 层级 节点到根节点最长
在队列的顺序存储中,采用出队方式 2, 删除 front 所指的元素,然后加 1 并返回被删元素。这样可以避免元素 移动,但是也带来了一个新的问题"假溢出"。 循环队列入队, 队尾循环后移: SQ->rear =(SQ->rea 79438401111 r+1)%Maxsize; 循环队列出队, 队首循环后移: SQ->front =(SQ->front+1)%Maxs
突然发现这个没发,图示随后补上#include "cstdio" //找到最大值 int GetMax(int arr[], int length){ int res = arr[0]; for(int count = 0; count < length; count++){ if(arr[count] > res){ res
后进先出 栈也是一种线性表,只不过它是操作受限的线性表,只能在一端操作。 进出的一端称为栈顶(top),另一端称为栈底(base)。栈可以用顺序存储,也可以用链式存储。#include "cstdio" #include "cstdlib" //预先分配空间,这个数值根据实际需要预估确定 #define max_size 128 typedef int ElemType; typedef
#include "cstdio" #define max_size 16 typedef struct QNode{ int data; struct QNode *next; }QNode; typedef QNode *QueuePtr; typedef struct Queue{ // 队列长度 int length; // 队列头指针
高并发 WEB 服务器中顺序表的应用高性能的 web 服务器 Squid 每秒可处理上万并发的请求,从网络连接到服务器的客户端与服务器端在交互时会保持一种会话(和电话通话的场景类似)。服务器端为了管理好所有的客户端连接,给每个连接都编了一个唯一的整数编号,叫做文件句柄,简称fd 为了防止某些恶意连接消耗系统资源,当某个客户端连接超时(在设定的一定时间内没有发送数据)时,服务器就需要关闭这些客户端
队列是一种受限的线性表,(Queue),它是一种运算受限的线性表,先进先出(FIFO First In First Out) 队列是一种受限的线性结构 它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。使用数组实现#include "stdio.h" //最大容量 #define max_size 10 typedef struct Queue{ //
双向链表添加元素前插法#include "stdio.h" #include "stdlib.h" typedef struct DoubleLinkNode{ int data; // 下一个节点的指针域 struct DoubleLinkNode *next; // 上一个节点的指针域 struct DoubleLinkNode *prev; }Doub
#include "stdio.h" int GetMaxnum(int arr[], int length){ int max_ele = arr[0]; for(int i = 0; i < length; i++){ if(arr[i] > max_ele){ max_ele = arr[i]; }
Joseph 问题: 有 10 个小朋友按编号顺序 1,2,。。。,10 顺时针方向围成一圈。从1号开始顺时针方向 1,2,。。。,9 报数,凡报数 9 者出列(显然,第一个出圈为编号 9 者) 最后一个出圈者的编号是多少?第 5 个出圈者的编号是多少?实现循环链表#include "stdlib.h" #include "stdio.h" typedef struct LNode{
链表不同于顺序表,顺序表底层采用数组作为存储容器,需要分配一块连续且完整的内存空间进行使用,而链表则不需要,它通过一个指针来连接各个分散的结点,形成了一个链状的结构,每个结点存放一个元素,以及一个指向下一个结点的指针,通过这样一个一个相连,最后形成了链表。它不需要申请连续的空间,只需要按照顺序连接即可,虽然物理上可能不相邻,但是在逻辑上依然是每个元素相邻存放的,这样的结构叫做链表(单链表)。优点:
分组插入排序算法: 取整数d1 = n / 2; 元素分成d1个组, 每组元素相邻元素距离d1。在各组内进行直接插入排序。 取第二个整数d2 = n / 2, 重复上述分组排序过程知道di = 1。即所有元素在同一组内直接排序。 希尔排序每趟并不使某些元素有序,而是使整体数据越来越接近有序。直至最后一趟排序使得所有数据有序。当然这里是每次取长度的一半,取数的选择可以非常多。#include "cs
顺序表是简单的一种线性结构,逻辑上相邻的数据在计算机内的存储位置也是相邻的,可以快速定位第几个元素,中间不允许有空值,插入、删除时需要移动大量元素。顺序存储:把逻辑上相邻的元素存储在物理 位置上也相邻的存储单元中,元素之间的关 系由存储单元的邻接关系来体现。静态#include "stdio.h" #include "stdlib.h" struct List { //实现顺序表的底层数
#include <cstdlib> #include "stdio.h" #define arr_len 20 void display(int arr[], int length) { for(int i = 0; i < length; i++){ printf("%d", arr[i]); printf(","); }
#include "stdio.h" void sift(int arr[], int low, int high){ // 根节点的位置 int i = low; // 把根节点存起来 int temp = arr[i]; // 子节点的位置 int j = 2 * i + 1; while (j < high
快速排序思路: 取⼀个元素p(第⼀个元素),使元素p归位; 列表被p分成两部分,左边都⽐p⼩,右边都⽐p⼤; 递归完成排序。快速排序的时间复杂度 O(nlogn)#include "stdio.h" int partition(int arr[], int left, int right){ int temp = arr[left]; while (left < right
比较慢:冒泡排序:列表每两个相邻的数,如果前⾯⽐后⾯⼤,则交换这两个数。 ⼀趟排序完成后,则⽆序区减少⼀个数,有序区增加⼀个数。 代码关键点:趟、⽆序区范围#include "stdio.h" int main(){ int arr[] = {8, 32, 22, 73, 95, 13, 9, 82, 23, 46, 71, 52, 90, 53, 77, 75, 65, 64, 74
基本概念:算法(Algorithm):⼀个计算过程,解决问题的⽅法Niklaus Wirth: “程序=数据结构+算法”时间复杂度时间复杂度:⽤来评估算法运⾏效率的⼀个式⼦经验当算法过程出现循环折半的时候, 复杂度式⼦中会出现logn.时间复杂度是⽤来估计算法运⾏时间的⼀个式⼦(单位)常⻅的时间复杂度(按效率排序) O(1)<O(logn)<O(n)<O(nlogn)<O
Copyright © 2005-2025 51CTO.COM 版权所有 京ICP证060544号