数据结构及算法
文章平均质量分 67
为了维护世界和平_
好好学习,天天向上
展开
-
数据结构与算法—堆(heap)
然后用同样的方法比较。这就是从上往下的堆化方法。原创 2023-02-28 12:26:09 · 541 阅读 · 1 评论 -
数据结构与算法—二叉树(tree)
二叉查找树在频繁的动态更新过程中,可能会出现树的高度远大于logn的情况,从而导致各个操作的效率下降。2、使用数组的顺序存储法,(左子节点 2*i 右子节点 2*i+1 仅仅浪费了下标为0的存储位置)树的任意一个节点,左子树的值小于这个节点的值,而右子树的值,大于这个节点的值。红黑树的高度近似2logn,比AVL树高度大了一倍,在性能上下降并不多。: 左节点原创 2023-02-28 12:25:58 · 374 阅读 · 0 评论 -
数据结构与算法—散列表
工业级散列表的特性1,支持快速插入语、删除查找2、内存占用,不能浪费过多内存;3、稳定性,极端情况下的退化实现散列表1、设计合适的散列函数2、定义装载因子阈值,并支持动态扩容3、选择合适的散列冲突解决方法。原创 2023-02-27 09:32:21 · 431 阅读 · 0 评论 -
数据结构与算法—跳表(skiplist)
二分查找用的数组链表可不可以实现二分查找呢?原创 2023-02-26 14:42:53 · 1670 阅读 · 0 评论 -
数据结构与算法—二分查找
某个给定值的元素。通过二分查找,找到最后一个起始IP小于等于这个IP地址区间,然后,检查这个IP是否在这个IP区间内,如果在,就取出对应的归属地显示,如果不在则返回没找到。二分查找能解决的问题,大部分倾向于用散列表或者二叉查找树。即使二分查找在内存使用上更节省,但毕竟内存如此紧缺的情况并不多。二分查找更适合在“近似”查找问题,如二分查找的变体边界查找的处理。如果用散列表、二叉树、比较难实现。原创 2023-02-26 09:15:45 · 482 阅读 · 0 评论 -
数据结构与算法—递归recursion
最大深度比较小,如10,50,这样,否则警惕使用递归。因为当前线程剩余的栈空间大小事先无法计算,如果实时计算,代码过于复杂,影响可读性。避免重复计算,可以使用一个数据结构(如散列表)来保存已经求解过的f(k),当递归遇到f(k)时,先看是否已经求解过了,避免重复计算。现象,在递归实现时,如f(6) = f(5)+f(4);f(5)=f(4)+f(3),这样f(4)两次计算。递归调用一次就会在内存栈中保存一次现场数据,在分析递归代码空间复杂度时,需要额外考虑这部分开销。递归,函数调用的数量较大时,非常耗时。原创 2023-02-26 09:13:23 · 541 阅读 · 0 评论 -
数据结构与算法—队列queue
数组实现,队列大小有限,响应时间相对合理。链式实现,可能有更多的请求排队等待,请求处理响应时间过长,针对时间比较敏感的系统,链式不太合适。在循环队列、阻塞队列、并发队列,在底层系统、框架、中间件开发,起到至关重要的作用。队列为空的时候,从队头取数据会被阻塞,没有数据可以获取,知道队列中有数据才能返回;在多线程情况下,会有多个线程同时操作队列,这时要考虑线程安全问题。基于数组的循环队列,利用CAS原子操作,高效实现并发。如果队列满,插入数据操作会被阻塞,直到有空闲位置再插入,然后返回。2)尾指针,指向队尾;原创 2023-02-25 09:36:54 · 452 阅读 · 0 评论 -
数据结构与算法—栈stack
所以根本上,只要能保证每进入一个新的函数,都是一个新的作用域就可以。在进入被调用函数的时候,分配一段栈空间给这个函数的变量,在函数结束的时候,将栈顶复位,正好回到调用函数的作用域内。其实,我们不一定非要用栈来保存临时变量,只不过如果这个函数调用符合后进先出的特性,用栈这种数据结构来实现,是最顺理成章的选择。出栈和入栈只需要两个临时变量存储空间,空间复杂度O(1),存n个数据,不能说时间复杂度O(n),因为n个空间是必须的。从操作数中取出两个数,进行计算,计算后再将结果压入操作数栈,继续比较。原创 2023-02-25 09:28:42 · 411 阅读 · 0 评论 -
数据结构与算法—链表list
链表,一种提高数据读取性能的技术,在硬件设计、软件开发中有广泛应用。常见CPU缓存,数据库缓存,浏览器缓存等。而且链表的删除,插入导致内存申请和释放,容易造成内存碎片。数组缺点,系统没有足够的连续空间,导致内存不足。数组申请时大小固定,如果不够用,不支持动态扩容。维护一个链表,越靠近尾部节点,是越早之前访问。有新数据访问时,从链表头开始顺序遍历链表。,预读数组中的数据,访问效率更高。而链表在内存中并不是连续存储,没法预读。数组与链表的对比,并不能局限于时间复杂度。数组简单易用,在实现上使用连续的内存空间,原创 2023-02-24 21:00:34 · 613 阅读 · 0 评论 -
数据结构与算法—数组array
删除优化:避免每次搬移数据,可以先记录已经删除的数据位置,当数组空间不足时,再出发一次真正删除,减少搬移次数。在尾插入,O(1),如果在头插入,所有的数据都需要移动一位。数组越界,数组大小3,a[0],a[1],a[2]。a[3]是错误的,并且编译器不报错。数组查找的时间复杂度不是O(1),即使排序好的数组,二分查找,复杂度O(logn)用一组连续的内存空间,来存储一组具有相同类型的数据。业务开发,直接使用容器,省时省力。如果 底层开发,性能优化要做到极致,数组优于容器。非线性表,二叉树,堆,图等。原创 2023-02-24 20:59:06 · 521 阅读 · 0 评论 -
堆和栈的区别(转过无数次的文章)
一、预备知识—程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。转载 2017-08-23 08:48:37 · 229 阅读 · 0 评论 -
ubi文件系统,出现ubimkvol: invalid number xxxMiB错误
hisi 在创建ubifs文件系统ubimkvol /dev/ubi0 -N program -s 100MiB 显示:ubimkvol: invalid number '100MiB'不支持MiB,需要将 100MiB换成 10241024100 = 104857600即:ubimkvol /dev/ubi0 -N program -s 104875600ubi的使用cat /proc/mtd#查看分区情况ubiformat /dev/mtd3#格式化ubi分区ubiatta原创 2020-07-14 21:26:29 · 1269 阅读 · 0 评论 -
C语言,多个文件编程,使用不同.c文件的变量声明方法以及头文件的包含
01.c 文件中程序 访问02.c中的变量t#include "01.h"#include "02.h"#includeextern int t;int main(){ int n; n = GetYear(); printf("Year=%d,time==%d\n",n,t);}02.h 中代码如下#includeint GetYe原创 2016-12-31 21:56:49 · 1590 阅读 · 2 评论 -
将中文的0-9数字编码转化为ascii
将中文的0-9数字编码转化为asciigb2312的数字编码:0->A3B0 1->A3B1 … 9 ->A3B9而ASCII :0->0x30 1->0x31 … 9->0x390-9数字编码 如何将gb2312转化为ascii demo如下char roadline[] = {0xa3, 0xb2, 0xa3, 0xb0, 0xa3, 0xb2};char conv_data[32];int roadline_total_len = 6;原创 2020-08-12 08:28:08 · 2834 阅读 · 0 评论 -
字符编码 utf-8 与 gb2312之间的转换 C 实现
字符编码 utf-8 与 gb2312之间的转换字符编码查询 汉字字符集编码查询设备之间的收发端使用的gb2312, 比如“早”字编码为(D4E7), 而网络下载的txt文件的编码为utf-8为了比较这两类文件,需要转化到统一的编码,这里将 utf-8转化为gb2312C 实现//代码转换:从一种编码转为另一种编码 static int code_convert(char * from_charset, char * to_charset, char * inbuf, size_原创 2020-06-08 10:49:11 · 1338 阅读 · 0 评论 -
C语言 分割字符串 大话数据结构
分割字符串#include<stdio.h>#include<string.h>void split(char str[],char * split){ char * p; p = strtok (str,split); printf("%d\n",p); while(p!=NULL) { printf ("%s\n",p); p原创 2017-09-30 21:59:49 · 407 阅读 · 0 评论 -
C语言 调整数组顺序使奇数位于偶数前面
void oddEven(int *p,unsigned int len,int (*fun)(int)){ if(p == NULL || len == 0) return ; int *pStart = p; int *pEnd = pStart+len - 1; while(pStart < pEnd) { //从前向后找原创 2017-09-30 21:11:55 · 495 阅读 · 0 评论 -
C语言 链表中倒数第K个节点
listNode *FindNtoTail(listNode *head,unsigned int n) { if(head == NULL || n == 0) return NULL;listNode *pHead = head;listNode *pBehind = NULL;unsigned int i;// pHead 向前移动 n-1 for(i原创 2017-09-30 20:54:11 · 472 阅读 · 0 评论 -
C语言 链表中 环的入口点
// 有没有环 以及环的入口ListNode meetingNode(ListNode *pHead;) {if(pHead == NULL) return ;ListNode *pSlow = pHead->next;if(pSlow == NULL) return ;ListNode *pFast = pHead->next;if(pFast == NULL) retur原创 2017-09-28 09:23:51 · 893 阅读 · 0 评论 -
两个单链表相交,求开始相交的点
先遍历两个链表,求得它们的长度,n, m, 长度长得链表先走 |n-m| 步,再同时走,没走一步都看指针是否相等,相等则为首次相交得点,跳出循环。原创 2017-08-30 10:18:03 · 398 阅读 · 0 评论 -
C数据结构-栈
栈 : 在表尾进行删除和插入操作的线性表用栈来实现表达式中括号()[]{}是否匹配原创 2017-07-09 15:25:47 · 319 阅读 · 2 评论 -
数据结构之线性表顺序存储
//线性表顺序存储#include#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0typedef int Status;#define MAXSIZE 20typedef int ElemType; typedef struct { ElemType data[MAXSIZE]; int length原创 2017-06-13 21:00:32 · 281 阅读 · 0 评论 -
数据结构之线性表链式存储(链表)
//线性表的链式存储结构#include#include#include#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0#define MAXSIZE 20typedef int Status;typedef int ElemType;typedef struct Node{ ElemType data原创 2017-06-13 21:03:46 · 666 阅读 · 0 评论 -
直接插入排序
直接插入排序:将一个记录插入到已经排好的有序表中,从而得到一个新的、记录数增1的有序表#include<stdio.h>void InsertSort(int k[],int n)原创 2017-07-14 22:50:20 · 233 阅读 · 0 评论 -
C语言 归并排序
归并排序(递归实现)#include<stdio.h>void swap(int k[],int low,int high){ int tmp; tmp = k[low]; k[low] = k[high]; k[high] = tmp;}void merging(int *list1,int list1_size,int *l原创 2017-07-14 22:55:48 · 297 阅读 · 0 评论 -
C语言 堆排序
堆排序:将待排序的序列构造成一个大顶堆。此时整个序列的最大值就是堆顶的根节点。将它移走(与末尾元素交换,此时末尾元素就是最大值),然后将剩余的n-1个序列重新构造成一个堆,这样就会得到n个元素的次大值。如此反复执行。时间复杂度为O(nlogn)原创 2017-07-14 23:07:50 · 274 阅读 · 0 评论 -
C语言 希尔排序
基本思想:基本有序,小的关键字基本在前面,大的基本在后面,不大不小在中间。 在插入排序的基础上修改。插入排序每次步长都为1,而希尔排序引如**增量序列**gap,选择什么样的增量才是最好,目前还是个数学难题。原创 2017-07-15 15:07:16 · 251 阅读 · 0 评论 -
C 语言顺序表查找和折半查找
顺序查找 查找最好的情况是在第一个位置找到了,算法时间复杂度为O(1) 最坏的情况下在最后一个位置,需要n次比较,时间复杂度为O(n) 查不到,需要比较n+1次,时间复杂度为O(n+1) 关键字在任何一个位置上是相同的,所以平均查找次数为(n+1)/2 最终时间复杂度为O(n)//n 数组长度,key 查找关键字,a为数组原创 2017-07-15 15:39:31 · 2830 阅读 · 0 评论 -
C语言 二叉排序树
二叉排序树,又称二叉查找树。它或是一颗空树,或者是具有以下性质的二叉树。若它的左子树不空,则左子树上所有节点的值均小于它的根结构值;若它的右子树不空,则右子树上所有节点的值均小于它的根结构值;它的左右子树分别为二叉排序树。原创 2017-07-15 21:51:31 · 226 阅读 · 0 评论 -
C语言 平衡二叉树(AVL树)
平衡二叉树是一种二叉排序树,其中每一个节点的左子树和右子树的高度差至多等于1.原创 2017-07-15 22:00:12 · 317 阅读 · 0 评论 -
Windows下Python安装与使用
python官网下载链接官网链接 windows下安装: 安装时选中Add Python 3.6 to PATH,安装后可以直接使用,否则需要在window环境变量中添加路径点击 Install Now 按照步骤直接安装成功 //win左下角列表已经有安装好的文件,打开第一个直接使用//页面如下 使用过程中使用快捷键 Alt+p 显示上一条命令,与Linux中的up键相似,返回上一条命令。原创 2017-07-16 22:42:09 · 442 阅读 · 0 评论 -
C语言 队列(循环队列)实现
循环队列:头尾相接的顺序存储成为循环队列满队列的判断 办法一:设置一个标志flag,当front == rear 且 flag = 0 为空队列当 front == rear 且 flag = 1 为满队列(烦琐) 办法二: 满队列时,数组中还存在一个空闲单元(简单) 满队列的条件是(rear + 1)%QueueSize == f原创 2017-07-09 16:11:33 · 1539 阅读 · 0 评论 -
队列链式存储
链队列的数据结构为:typedef int QElemType;typedef struct QNode{ QElemType data; struct QNode *next;}QNode,*QueuePtr;typedef struct{ Queueptr front,rear;}LinkQueue;入队操作:Status EnQueue原创 2017-07-09 16:15:41 · 376 阅读 · 0 评论 -
C语言 冒泡排序
基本思想:两两比较相邻的关键字,如果返序则交换,直到没有返序为止。原创 2017-07-15 14:59:22 · 239 阅读 · 0 评论 -
简单选择排序
简单选择排序法:通过n-i次关键字间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i(0<=i<=n)个记录交换。原创 2017-07-14 22:47:25 · 309 阅读 · 0 评论 -
排序算法总结
排序主要用这六种:O(n^2)的有:冒泡排序、插入排序、选择排序;O(nlogn)的有:快排、归并排序、堆排序;冒泡排序:原理是无序区两两比较,每趟得到一个最大的放在无序区最后; 算法:外循环是趟数[0,n-1), 内循环是无序区个数[0, n-i-1);循环体是比较[j]和[j+1];插入排序:是把数组分成有序区和无序区两部分,每次从无序区取出一位作为t转载 2017-08-21 09:34:05 · 248 阅读 · 0 评论 -
C语言 快速排序
快速排序的基本思想:通过一次排序将待排记录分割成独立的两部分,其中一部分记录关键字均比另一部分记录的关键字小,则可以分别对这两部分记录继续进行排序,以达到整个序列有序的目的#include<stdio.h>void swap(int k[],int原创 2017-07-14 22:58:55 · 321 阅读 · 0 评论 -
C语言实现循环链表与双向链表
《大话数据结构》之循环链表和双向链表 与单链表区别,原来判断p->next是否为空,现在判断p->next不等于头结点则循环结束不用头指针,使用指向终端节点的尾指针表示循环链表 将两个循环链表合并成一个:p=rearA->next;//保存A头结点rearA->next = rearB->next->next;//B表的第一个节点赋值给rearA->nextq=rearB->next;原创 2017-07-10 19:31:54 · 406 阅读 · 0 评论