
算法基础
算法基础
jenie
jenie
展开
-
c语言的this的精妙用法。类似实现c++ this的方法。
c语言的this的相关用法,细心体会。以后在c语言的数据结构和算法可以解耦使用。使用这个方法很强大 。先谈实现此方法的逻辑#ifndef _TEST_H_#define _TEST_H_typedef void Demo;//隐藏对外属性,模拟private限定符typedef struct test//定义类{ int mi; int mj;}Test;//定义类成员函数,通过参数可以看出来通过指针传递对象Demo* Creat(int i, int j);.原创 2020-07-11 23:40:18 · 4995 阅读 · 2 评论 -
关于C语言实现去中心化的网络设计 — P2P的代码实现
那我们如何来进行检测呢,如图所示如何穿透见证奇迹的时候到了。先实现个,整个代码逻辑和实现都是按原理方式实现udp.h#ifndef __UDP_H__#define __UDP_H__#include <stdio.h>#include <stdlib.h>...原创 2020-06-18 17:16:06 · 1355 阅读 · 3 评论 -
c语言实现bitmap
bit.h#ifndef _BIT_H_#define _BIT_H_/** *存储bitmap的结构体 *存储的顺序从左至右 **/struct _Bits;typedef struct _Bits *bits;/** *获得bitmap *@length bitmap的长度 *@return 所有位都初始化为0的bitmap */bits bit_new(unsigned int length);/** *销毁一个bitmap **/void bit_d.原创 2020-06-14 01:50:03 · 1076 阅读 · 0 评论 -
Huffman 算法原理及代码实现
Huffman 算法原理前缀码在一个字符集中,任何一个字符的编码都不是另一个字符编码的前缀,即前缀码。 例如,有两个码字 111 与 1111,那么这两个码字就不符合前缀码的规则,因为 111 是1111 的前缀。放到二叉树里来讲,只用叶子节点编码的码字才是前缀码,如果同时使用 中间节点和叶子节点编码,那结果就不是前缀码。因为压缩中经过编码的码字全部是前 缀码,所以在对照码表解压的时候,碰到哪个码字就是哪个码字,不用担心出现某个字 符的编码是另一个字符的编码的前缀的情况,该意识一定要具备。.原创 2020-06-13 13:10:09 · 2903 阅读 · 0 评论 -
c语言设计模式代码完整实现-责任链模式
模式介绍责任链将需要触发的对象组成一条链,发送者将请求发给链的第一个接收者,并且沿着这条链传递,直到有一个对象来处理它或者直到最后也没有对象处理而留在链末尾端。图表1责任链模式流程图责任链在C语言里也是实现形式非常明显的模式。最典型的责任链有linux内核的中断处理机制的纯软件部分和内核网络netfiler的HOOK机制。这两者均强化了责任链机制,重点在引入了责任优先级方法和增加了通过/终结两种处理结果。责任链模式的最重要的数据结构是handler链表。事件发生时,handler链表上的.原创 2020-06-02 00:06:23 · 1348 阅读 · 2 评论 -
c语言设计模式代码完整实现-观察者模式(Observer)
模式介绍:观察者模式(Observer)观察者模式定义了对象之间的一对多依赖关系,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并且自动更新。在这里,发生改变的对象称之为观察目标,而被通知的对象称之为观察者。一个观察目标可以对应多个观察者,而且这些观察者之间没有相互联系,所以么可以根据需要增加和删除观察者,使得系统更易于扩展。图表1观察者模式流程图观察者模式在C语言里也是实现形式非常明显的模式。逻辑上和责任链模式最相近的一个设计模式为观察者模式...原创 2020-06-02 00:02:24 · 2987 阅读 · 0 评论 -
c语言设计模式代码完整实现-状态机模式
模式介绍状态(state)模式是C语言实现相当常用的模式,也是能够在C语言***现出来的最显性的模式之一。在面向对象里,状态模式允许一个对象在内部状态改变的时候改变其行为。状态用法很多,最常见的是状态机,分为无限状态机和有限状态机。有限状态机finite-state machine,FSM,输入集合和输出集合都是有限的,并只有有限数目的状态。一般说到状态机即是对有限状态机的简称。无限状态机infinite-state machine,ISM,输入和输出集合无线,状态数目无限的状态...原创 2020-06-01 23:58:26 · 7535 阅读 · 0 评论 -
c语言设计模式代码完整实现-基础(链表实现)
在讲设计模式时,我们先自己先实现一个链表,后面会当个模块使用list.h#pragma oncetypedef struct list_head{ struct list_head* prev; struct list_head* next;} ;#define LIST_FOR_EACH(pos, head) \ for(pos=(head)->next;pos!=(head);pos=pos->next)#define LIST_HEAD_INI原创 2020-06-01 23:47:16 · 903 阅读 · 1 评论 -
C语言中函数指针和回调函数
函数指针:指向函数的指针变量。 因此“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。如前所述,C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上是大体一致的。函数指针有两个用途:调用函数和做函数的参数。我们首先来看一个函数指针的例子:#include <stdio.h>#includ原创 2020-05-12 17:15:15 · 423 阅读 · 0 评论 -
C语言变长数组data[0]的使用方法
、前言 第一次见到时感觉很奇怪,数组的长度怎么可以为零呢?于是上网搜索一下这样的用法的目的,发现在linux内核中,结构体中经常用到data[0]。这样设计的目的是让数组长度是可变的,根据需要进行分配。方便操作,节省空间。2、data[0]结构经常遇到的结构形状如下:struct buffer{ int data_len; //长度 char data[0]; //起始地址};在这个结构中,data是一个数组名;但该数组没有元素;该数组的真实地址紧随结构体b原创 2020-05-12 12:52:00 · 971 阅读 · 0 评论 -
c语言实现类型操作系统的进程任务调度。通过代码理解操作系统的任务,进程调度机制。也能应用领域中。
直接上代码。你懂的。#include<stdio.h>#include<string.h>#include<stdlib.h>#define TAKEIN "takein"//对应的进程状态#define WAIT "wait"#define RUN "run"#define FINISH "finish"#define PNUMBER 5//进程个数#define TRUE 1#define FALSE 0typedef struct pc.原创 2020-05-12 01:38:01 · 534 阅读 · 0 评论 -
B+树的原理详解及代码实现功能
B树的定义为“在计算机科学中,B树(B-tree)是一种树状数据结构,它能够存储数据、对其进行排序并允许以O(log n)的时间复杂度运行进行查找、顺序读取、插入和删除的数据结构。B树,概括来说是一个节点可以拥有多于2个子节点的二叉查找树。与自平衡二叉查找树不同,B-树为系统最优化大块数据的读和写操作。B-tree算法减少定位记录时所经历的中间过程,从而加快存取速度。普遍运用在数据库和文件系统。”定义B 树可以看作是对2-3查找树的一种扩展,即他允许每个节点有M-1个子节点。根节点至少有两个子节原创 2020-05-12 01:26:03 · 6984 阅读 · 3 评论 -
布隆过滤器(Bloom Filter)原理分析及代码实现
布隆过滤器(Bloom Filter)原理分析及代码实现直观的说,bloom算法类似一个hash set,用来判断某个元素(key)是否在某个集合中。和一般的hash set不同的是,这个算法无需存储key的值,对于每个key,只需要k个比特位,每个存储一个标志,用来判断key是否在集合中。算法:1. 首先需要k个hash函数,每个函数可以把key散列成为1个整数2. 初始化时,需要一个长度为n比特的数组,每个比特位初始化为03. 某个key加入集合时,用k个hash函数计算出k个散列值,并原创 2020-05-12 01:20:28 · 1155 阅读 · 1 评论 -
关于红黑树的c语言实现代码。
根据之前一节,描述了红黑树原理,这次把相关代码进行实现一下。原理如下:https://blog.youkuaiyun.com/jenie/article/details/105871388#include <stdio.h>#include <stdlib.h>#include <string.h>#define RED 1#define BLACK 2typedef int KEY_TYPE;typedef str.原创 2020-05-12 01:10:28 · 716 阅读 · 1 评论 -
布隆过滤器第简单笔记
原创 2020-05-09 21:00:16 · 108 阅读 · 0 评论 -
关于uthash库的终级使用方法。
关于uthash的说明,可以参考网址https://github.com/troydhanson/uthash为了方便,我这里直接上uthash的库,大家可以直接使用/*Copyright (c) 2003-2018, Troy D. Hanson http://troydhanson.github.com/uthash/All rights reserved.Red...原创 2020-05-07 01:46:01 · 1096 阅读 · 0 评论 -
红黑树笔记
什么是红黑树? 红黑树是一种自平衡二叉查找树,是计算机科学领域中的一种数据结构,典型的用途是实现关联数组,存储有序的数据。它是在1972年由Rudolf Bayer发明的,别称"对称二叉B树",它现代的名字由 Leo J. Guibas 和 Robert Sedgewick 于1978年写的一篇论文中获得的。它是复杂的,但它的操作有着良好的最坏情况运行时间,并且在实践中是高效的。它可以...原创 2020-04-30 23:01:51 · 219 阅读 · 0 评论 -
红黑树-随手笔记
所谓的树形结构就是各个元素之间具有分层关系的数据结构,常用一棵倒置的树来表示逻辑关系。所谓的根节点就是树的最顶端的节点,继续往下分为子节点,当不断细分直到不再有子节点时为叶子节点。红黑树性质定义:1 根结点是黑的2 每个结点是红的或是黑的3 每个叶子结点是黑的4 如果一个结点是红的,则它的二个儿子都是黑的5 每个结点,从该结点到其子孙结点的所有路径 上的包含相同...原创 2020-04-30 22:22:36 · 180 阅读 · 0 评论 -
队列算法
一:概念 队列是一个”先进先出“的线性表,牛X的名字就是“First in First Out(FIFO)”, 生活中有很多这样的场景,比如读书的时候去食堂打饭时的”排队“。当然我们拒绝插队。二:存储结构 前几天也说过,线性表有两种”存储结构“,① 顺序存储,②链式存储。当然“队列”也脱离 不了这两种服务,这里我就分享一...原创 2020-04-29 19:24:53 · 1239 阅读 · 0 评论 -
kmp算法
简介 KMP 算法是 D.E.Knuth、J,H,Morris 和 V.R.Pratt 三位神人共同提出的,称之为 Knuth-Morria-Pratt 算法,简称 KMP 算法。该算法相对于 Brute-Force(暴力)算法有比较大的改进,主要是消除了主串指针的回溯,从而使算法效率有了某种程度的提高。提取加速匹配的信息 上面说道 KMP 算法主要是通过消除主串指针...原创 2020-04-29 19:17:45 · 136 阅读 · 0 评论 -
基数排序(Radix Sort)
基数排序是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位。有时候有些属性是有优先级顺序的,先按低优先级排序,再按高优先级排序。最后的次序就是高优先级高的在前,高优先级相同的低优先级高的在前。10.1 算法描述取得数组中的最大数,并取得位数; arr为原始数组,从最低位开始取每个位组成radix数组; 对radix进行计数排序(利用计数排序适用于小范围数的特点...原创 2020-04-29 19:03:26 · 359 阅读 · 0 评论 -
桶排序(Bucket Sort)
桶排序是计数排序的升级版。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。桶排序 (Bucket sort)的工作的原理:假设输入数据服从均匀分布,将数据分到有限数量的桶里,每个桶再分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排)。9.1 算法描述设置一个定量的数组当作空桶; 遍历输入数据,并且把数据一个一个放到对应的桶里去; 对每个不是空的桶进行...原创 2020-04-29 19:02:09 · 253 阅读 · 0 评论 -
计数排序(Counting Sort)
计数排序不是基于比较的排序算法,其核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。 作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。8.1 算法描述找出待排序的数组中最大和最小的元素; 统计数组中每个值为i的元素出现的次数,存入数组C的第i项; 对所有的计数累加(从C中的第一个元素开始,每一项和前一项相加); 反向填充目标数组:将每个元素i放在新...原创 2020-04-29 18:59:53 · 563 阅读 · 0 评论 -
堆排序(Heap Sort)
堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。7.1 算法描述将初始待排序关键字序列(R1,R2….Rn)构建成大顶堆,此堆为初始的无序区; 将堆顶元素R[1]与最后一个元素R[n]交换,此时得到新的无序区(R1,R2,……Rn-1)和新的有序区(Rn),且满...原创 2020-04-29 18:58:46 · 203 阅读 · 0 评论 -
快速排序(Quick Sort)
快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。6.1 算法描述快速排序使用分治法来把一个串(list)分为两个子串(sub-lists)。具体算法描述如下:从数列中挑出一个元素,称为 “基准”(pivot); 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素...原创 2020-04-29 18:54:48 · 221 阅读 · 0 评论 -
归并排序(Merge Sort)
归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。5.1 算法描述把长度为n的输入序列分成两个长度为n/2的子序列; 对这两个子序列分别采用归并排序; 将两个排序好的子序列合并...原创 2020-04-29 18:47:35 · 205 阅读 · 0 评论 -
希尔排序(Shell Sort)
1959年Shell发明,第一个突破O(n2)的排序算法,是简单插入排序的改进版。它与插入排序的不同之处在于,它会优先比较距离较远的元素。希尔排序又叫缩小增量排序。4.1 算法描述先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,具体算法描述:选择一个增量序列t1,t2,…,tk,其中ti>tj,tk=1; 按增量序列个数k,对序列进行k 趟排序; 每趟排序,根...原创 2020-04-29 17:05:07 · 285 阅读 · 0 评论 -
插入排序(Insertion Sort)
插入排序(Insertion Sort)插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。3.1 算法描述一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下:从第一个元素开始,该元素可以认为已经被排序; 取出下一个元素,在已经排序的元...原创 2020-04-29 16:56:21 · 157 阅读 · 0 评论 -
选择排序(Selection Sort)
选择排序(Selection-sort)是一种简单直观的排序算法。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。2.1 算法描述n个记录的直接选择排序可经过n-1趟直接选择排序得到有序结果。具体算法描述如下:初始状态:无序区为R[1..n],有...原创 2020-04-29 16:54:30 · 251 阅读 · 0 评论 -
排序算法各算法总结
首先,排序算法的稳定性大家应该都知道,通俗地讲就是能保证排序前2个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同。在简单形式化一下,如果Ai = Aj,Ai原来在位置前,排序后Ai还是要在Aj位置前。 其次,说一下稳定性的好处。排序算法如果是稳定的,那么从一个键上排序,然后再从另一个键上排序,第一个键排序的结果可以为第二个键排序所用。基数排序就是这样,先按低位排...原创 2020-04-29 15:55:37 · 164 阅读 · 0 评论 -
冒泡排序(Bubble Sort)
冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。1.1 算法描述比较相邻的元素。如果第一个比第二个大,就交换它们两个; 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这...原创 2020-04-29 16:49:54 · 349 阅读 · 0 评论 -
栈算法
1.基本概念概念很简单,栈 (Stack)是一种后进先出(last in first off,LIFO)的数据结构,而队列(Queue)则是一种先进先出 (fisrt in first out,FIFO)的结构,如下图:#include <stdio.h>#include <string.h>#include <stdlib.h>#...原创 2020-04-29 19:32:27 · 1350 阅读 · 0 评论