
C算法精解
指针和递归'算法链表、栈、队列、集合、哈希表、堆、图等常用数据结构进行了深入阐述;对排序、搜索数值计算、数据压缩、数据加密、图算法、几何算法等经典算法进行了精辟的分析和讲解。
轻飘风扬
有较强的团队合作精神,学习能力较强,善于学习新技术,为人乐观积极做事有耐心,能够在较强的压力下工作,有较强的适应能力,真诚温和,做事踏实,有较强的动手能力
展开
-
数据结构与算法学习--二叉树及二叉搜索树
可以看下以前对数的总结https://blog.youkuaiyun.com/sjin_1314/article/details/8507490下面是二叉树的遍历,创建及销毁的函数实现,层次遍历依赖队列;队列实现可以去github上查看https://github.com/jin13417/algo/tree/master/c-cpp/23_binarytree/tree/***************...原创 2018-11-14 11:56:12 · 891 阅读 · 1 评论 -
数据结构与算法学习--哈希
一、散列表的由来1.散列表来源于数组,它借助散列函数对数组这种数据结构进行扩展,利用的是数组支持按照下标随机访问元素的特性。2.需要存储在散列表中的数据我们称为键,将键转化为数组下标的方法称为散列函数,散列函数的计算结果称为散列值。3.将数据存储在散列值对应的数组下标位置。二、如何设计散列函数?总结3点设计散列函数的基本要求1.散列函数计算得到的散列值是一个非负整数。2.若key1=...原创 2018-11-08 22:03:23 · 1026 阅读 · 0 评论 -
数据结构与算法学习--跳表
跳表Skip List是一种随机化的数据结构,基于并联的链表,其效率可比拟于二叉查找树(对于大多数操作需要O(log n)平均时间)。基本上,跳跃列表是对有序的链表增加上附加的前进链接,增加是以随机化的方式进行的,所以在列表中的查找可以快速的跳过部分列表(因此得名)。所有操作都以对数随机化的时间进行。Skip List可以很好解决有序链表查找特定值的困难。跳表的定义及如何构造跳表构造一个有序...原创 2018-11-04 23:13:29 · 993 阅读 · 1 评论 -
数据结构与算法学习--二分查找
二分查找(Binary Search)算法,也叫折半查找算法。二分查找针对的时一个有序的数据集合,查找思想有点类似于分治。每次都是通过和区间的中间元素进行比较,将待查区缩小为原来的一半,直到将元素找到或者区间缩小为0。我们可以通过2种方式实现:递归和非递归/*********************************************************************...原创 2018-11-02 11:04:45 · 821 阅读 · 0 评论 -
数据结构与算法学习--排序总结
排序算法已经学习完了,但是在项目开发过程中如果去选择一个高效的排序算法;下面是对前面几种算法的总结。如何实现一个通用的、高效率的排序函数线性排序算法(计数、桶、计数排序)的时间复杂度比较低,但是适用的场景也比较特殊。如果针对小规模的数据进行排序,可以选择时间复杂度0(n^2)的算法;如果针对大规模的排序,时间复杂度0(nlogn)的算法更加高效。所以为了兼顾任意规模数据的排序,一般都会首选时...原创 2018-10-31 16:25:50 · 687 阅读 · 0 评论 -
数据结构与算法学习--排序(桶排序,计数排序,基数排序)
基数排序和计数排序可以参照链接桶排序:桶排序 (Bucket sort)或所谓的箱排序,是一个排序算法,工作的原理是将阵列分到有限数量的桶子里。每个桶子再个别排序(有可能再使用别的排序算法或是以递回方式继续使用桶排序进行排序)。桶排序是鸽巢排序的一种归纳结果。当要被排序的阵列内的数值是均匀分配的时候,桶排序使用线性时间(Θ(n))。但桶排序并不是 比较排序,他不受到 O(n log n) 下限...原创 2018-10-30 22:31:11 · 636 阅读 · 0 评论 -
数据结构与算法学习--排序(归并排序,快排序)
1、归并排序归并排序使用时分治思想,就是将大问题分解成子问题,一般都是通过递归来实现。下面是归并排序的代码实现。void merge_sort(int a[],int left,int right){ int middle = 0; /*递归结束条件*/ if(left >= right) { return; } middle = (left + rig...原创 2018-10-29 11:29:23 · 438 阅读 · 0 评论 -
数据结构与算法学习--排序(冒泡排序,插入排序,选择排序)
排序是最基本的算法,在项目开发中经常遇到,也是面试环节中考察最多的。1、冒泡、插入、选择三种排序的比较及代码实现“有序度”和“逆序度”:对于一个不完全有序的数组,如4,5,6,3,2,1,有序元素对为3个(4,5),(4,6),(5,6),有序度为3,逆序度为12;对于一个完全有序的数组,如1,2,3,4,5,6,有序度就是n*(n-1)/2,也就是15,称作满有序度;逆序度=满有序度-有序...原创 2018-10-28 11:42:11 · 959 阅读 · 0 评论 -
数据结构与算法学习--递归
今天简单了解一下递归,递归对我来说还是比较难理解的一种算法;关键因素是如何找到递推的公式。下面就简单的来了解一下满足递归的条件,及递归的弊端,递归的关键因素。递归的弊端:1、堆栈溢出问题函数调用都会讲临时数据变量进行压栈处理,等函数调用结束才出栈;如果递归调用深度太大,就会导致栈溢出。linux系统栈的大小一般是1K大小,可以在代码中增加判断,调用深度大于1K时,直接返回。只是简单的避免...原创 2018-10-17 23:13:34 · 517 阅读 · 0 评论 -
数据结构与算法学习--队列
今天我们开始学习队列的;队列在实际项目开发中使用的很广泛,比如我们经常说的线程池,在处理大部分资源不足的情况下,都会考虑使用队列来缓存请求数据。1、阻塞队列阻塞队列时一种典型的“生产者–消费者”模型,就在队列的基础上增加的阻塞的功能(其实就是一种同步机制)。当队列为空时,出队阻塞;当队列满时,入队阻塞。还有下面多消费者–单生产者模式。上面的就是我们线程池的基本架构,在多个线程同时操作队...原创 2018-10-15 23:40:07 · 418 阅读 · 0 评论 -
数据结构与算法学习--栈
1、顺序栈的实现:/************************************************************************* > File Name: arrayStack.h > Author: jinshaohui > Mail: jinshaohui789@163.com > Time: 18-10-..原创 2018-10-13 16:26:51 · 514 阅读 · 0 评论 -
数据结构与算法学习--链表二
单链表反转链表中环的检测两个有序的链表合并/************************************************************************* > File Name: lisklist.c > Author: jinshaohui > Mail: jinshaohui789@163.com > Time...原创 2018-10-13 01:04:49 · 371 阅读 · 0 评论 -
数据结构与算法学习:链表
链表基本介绍常用缓存策略原创 2018-10-11 00:19:54 · 253 阅读 · 0 评论 -
数据结构与算法学习:数组
今天我们开始学习最基本,最简单的数据类型:数组;它是一种线性数据结构。具有一组连续的内存空间来存储相同数据类型的结构。原创 2018-10-07 20:58:45 · 363 阅读 · 0 评论 -
数据结构及算法学习:复杂度分析
复杂度学习目的及相关术语时间复杂度分析原创 2018-10-05 11:21:14 · 430 阅读 · 0 评论 -
浅谈数据的查找(二分查找)
二分查找 以下是百度百科上的介绍: 二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关原创 2013-03-11 21:46:47 · 3976 阅读 · 1 评论 -
浅谈排序算法实现 (计数排序、基数排序)
1、 计数排序 计数排序是一种高效的线性排序,它通过计算一个集合中元素楚翔的次数来确定集合如何排列,计数排序不需要进行数据的比较,所有他的运行效率前面介绍的都高。 计数排序(Counting sort)是一种稳定的排序算法。计数排序使用一个额外的数组Count_arr,其中第i个元素是待排序数组Arr中值等于i的元素的个数。然后根据数组Count_arr来将Arr中原创 2013-03-09 23:39:30 · 7882 阅读 · 10 评论 -
浅谈排序算法实现(冒泡、交换、插入、快速)
排序是指将元素集合按照规定的顺序排列,通常有2中方法,升序和降序排序。排序的目的就是是数据能够以更有意义的形式表现出来。虽然排序最显著的应用时排列数据以显示它,但它往往可以用来解决其他的问题,特别是作为成熟算法的一部分。 总的来说,排序的算法有2大类:比较排序和线性时间排序。比较排序依赖于比较和交换来讲元素移动到正确的位置上。令人惊讶的是,并不是所有的排序算法都依赖于比较。对于那些依赖于比较原创 2013-03-05 21:35:20 · 5078 阅读 · 2 评论 -
基于图(graph)的应用举例
1、统计网络跳数 图在解决许多与网络相关的问题时起到了重要的作用,统计在internet中从一个节点访问其他节点时中间必须经过的最小的节点数,这个消息在internet中非常有用,因为最明显的网络开销直接和所要的遍历的节点数目相关。 下面是采用BFS实现计算网络跳数,使用了前面提供的队列及链表的函数接口。在阅读中希望先把链表和队列的相关的函数接口了解下。 先了解下程序中几原创 2013-03-03 18:11:16 · 3995 阅读 · 0 评论 -
浅谈优先队列(priority queue)
优先队列简述 与前面F I F O结构的队列不同,优先队列中元素出队列的顺序由元素的优先级决定。从优先队列中删除元素是根据优先权高或低的次序,而不是元素进入队列的次序。 优先队列(priority queue)是0个或多个元素的集合,每个元素都有一个优先权或值,对优先队列执行的操作有1) 查找;2) 插入一个新元素;3) 删除。在最小优先队列(min priorityq u e u原创 2013-01-28 21:53:07 · 14971 阅读 · 0 评论 -
C算法精解---图(Graph)
在计算机科学领域,图是最为灵活的数据结构之一。事实上,大多数的数据结构都能用图的形式表示,尽管按照这种方法表示它们通常会变得更加复杂。图是一种灵活的数据结构,描述一种模型用来定义对象之间的关联和联系。对象有顶点表示,对象之间的关系或关联则通过顶点的边来表示。 图的遍历方法: 深度优先搜索:(DFS:Depth First Search) 深度优先搜索在搜索过程中每当访问到某个顶点后原创 2013-02-23 22:36:23 · 9930 阅读 · 0 评论 -
C 算法精解----堆的实现及分析
堆的描述 堆是一种二叉树结构,通常是子节点的数值比父节点的值小,所以根节点是树种最大的节点。同样也可以说子节点的数值比父节点的数字大,所以根节点是树中最小的结点。子节点值比父节点值小的堆叫最大堆,反之,最小堆。下面来看下堆的性质:父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值。每个结点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆)。原创 2013-01-27 16:50:23 · 4215 阅读 · 5 评论 -
二叉搜索树(Binary Search Tree )的定义及分析
定义: 二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树: 每个结点都有一个作为搜索依据的关键码(key),所有结点的关键码互不相同。 左子树(如果非空)上所有结点的关键码都小于根结点的关键码。 右子树(如果非空)上所有结点的关键码都大于根结点的关键码。 左子树和右子树也是二叉搜索树。结点左子树上所有关键码小于结点关键码;原创 2013-01-22 21:59:50 · 6164 阅读 · 0 评论 -
C 算法精介绍---二叉树的定义和介绍
前面对二叉树有了简单的认识,下面就先介绍下二叉树的定义和分析(以下是自己对函数分析):值得一说的就是在bitree_ins_left()函数中定义的二级指针position的使用。如何不是在图纸上画了下,我可能还没有理解用法。这个可能需要修改下,更容易理解。 /*bitree.h*/#ifndef BITREE_H#define BITREE_H#include /*为原创 2013-01-17 22:25:17 · 3456 阅读 · 0 评论 -
C算法精解---树的基础知识
数据结构中为了存储和查找的方便,用各种树结构来存储文件。树的应用相当广泛,在数据库系统、用户界面、表达式处理、人工智能、时间调度、优先级队列、赫夫曼编码等都有应用。下面就和大家一起来学习树。首先了解下树的一些概念、性质、二叉树的遍历及树分类。先看下面的导图吧 遍历二叉树 上面的导图对遍历二叉树的方法进行了划分。二叉树的先序、中序及后序遍历的算法一般是由递归来实现的。我们首先来看下原创 2013-01-15 22:56:40 · 3334 阅读 · 0 评论 -
C算法精解-----哈希表(2)
前面对链式哈希表的定义、实现、分析的一下,感觉也不是想象中的那么难,只要把思路理清,在草稿纸上画下他的实现思路,代码阅读起来也就一目了然了。下次再看时,只要把当初画的草图一拿出来就知道,当初定义的函数接口:插入、删除、查找是怎么实现的。数据结构本身就是很抽象的东西。对初学者来说,画草图是很容易理解代码实现思路。 下面介绍另外一种哈希表的实现方法 :开地址哈希表的描述。 在链式哈希表中,原创 2013-01-12 22:15:17 · 5758 阅读 · 4 评论 -
C算法精解-----哈希表(1)
前面写过一篇哈希表在检索SIP电话中的应用,是在阅读代码中遇到的,而专门去学习了哈希表的基本思想和哈希函数。下面自己阅读C算法精解书籍中自己总结了下面的内容。只总结一小部分,随后会继续更新。现在也在学习思维导图的应用,前面的博客中已经使用过。下面就利用思维导图总结的哈希表的内容: 下面介绍个经典的字符串哈希函数:/*hashpjw.c*/unsigned int h原创 2013-01-07 22:47:14 · 5209 阅读 · 5 评论 -
哈希表----在VOIP用户信息存储中的应用
哈希表是种数据结构,它可以提供快速的插入操作和查找操作。第一次接触哈希表时,它的优点多得让人难以置信。不论哈希表中有多少数据,插入和删除(有时包括侧除)只需要接近常量的时间即0(1)的时间级。实际上,这只需要几条机器指令。 对哈希表的使用者一一人来说,这是一瞬间的事。哈希表运算得非常快,在计算机程序中,如果需要在一秒种内查找上千条记录通常使用哈希表(例如拼写检查器)哈希表的速度明显比树快,树原创 2013-01-06 11:26:32 · 3603 阅读 · 1 评论 -
集合的应用----集合覆盖分析
集合覆盖问题(Set Covering Problem,简称SCP)是运筹学研究中典型的组合优化问题之一,工业领域里的许多实际问题都可建模为集合覆盖问题,如资源选择问题、设施选址问题(移动基站的选址、物流中心的选址)等。问题: 给定一个集合S,集合P是由集合S的子集A1到An组成,集合C由集合P中的一个或者多个自己组成。如果S中的每个成员都包含在C的至少一个自己中车成为集合C覆盖S。此外,原创 2013-01-05 22:28:31 · 8571 阅读 · 2 评论 -
C算法精解 ---集合的实现和分析
前面已经介绍了链表、栈和队列的实现,也了解到在栈和队列的实现过程中,都用到的单链表的函数接口。下面介绍新的:集合。 集合是不同对象的无序的聚集,集合的2个重要特点就是无序、和无重复性。在高中已经了解集合的很多知识,下面来回忆下,集合的特性。目前正在学习思维导图(本人也想把这个软件推荐给大家使用,软件可以在我的下载界面下载,链接:点击打开链接),下面就花了个文字型的导图,来介绍集合的定义、基原创 2013-01-03 16:32:01 · 3129 阅读 · 0 评论 -
数据结构----栈运用的小例子
题:输入一个10进制整数,输出16进制。 转化16进制数,首先应该除以基数16,得到的模为转化后的最低位的数,得到的商再除以基数16,再得到模就是下个位的数........以此类推,当商等于0时,停止转化。这样我们很容易想到运用栈的特性先进后出来保存得到模,最后全部打印出来;下面使用顺序栈实现:#include #include #define N 20typedef i原创 2013-01-01 11:28:24 · 4460 阅读 · 0 评论 -
数据结构---队列的实现和个人分析
队列的一个显著的特征正好的和栈是相反的,它是按照先进先出(FIFO)的方式存储和检索元素,这就是说,对线插入队列的要先删除。还有就是队列是限制在两端进行插入和删除操作的线性表,允许进行存入操作的一端就叫“队尾”,允许进行删除操作的就是“对头”。当线性表中没有元素时,称为“空队“。那么,我们可以吧队列想象地理解成银行办理业务的一队人。 下面介绍顺序队列的定义和实现(以前写的代码)/*s原创 2012-12-31 15:48:14 · 2876 阅读 · 0 评论 -
数据结构----栈的实现和个人分析
通常来说,决定采用何种方式来检索数据是非常重要的,这样便于以后对数据检索时,数据会按照何种的方式顺序输出。栈是用于检索数据的一种常用方式。栈的一种显著的特征就是它按照后进先出(LIFO)的方式存储和删除数据元素。这就是说,最后一个存入栈中的元素将会被第一个删除。我们可以看下图的表示;栈的实现方法有2种,一种是顺序栈,一种是链式栈;下面先介绍下顺序栈的定义和实现(以前写过的代码)原创 2012-12-31 00:25:36 · 3267 阅读 · 0 评论 -
链表和数组的问与答
问:链表和数组各有自己的优越性,那么分别在什么情况下使用更适合? 当我们期望进行频繁的插入和删除时,链表比数组更有优势。然而,如果当我们期望进行随机访问的次数高于插入和删除操作的次数时,数组就显得更有优势了。随机访问时数组的强项,因为他们的元素在内存中是连续排列的。哲宗连续的排列方式使得数组中的任何元素能够在O(1)的时间内通过其索引访问。回顾一下访问链表中元素的方法,我们必须原创 2012-12-29 23:49:56 · 2488 阅读 · 0 评论 -
C 算法 -----链表在页帧和页面转换的应用
1 、单链表在页帧管理的应用 在一些支持虚拟内存的系统中有关链表的运用,虚拟内存是一种地址空间的映射机制,它允许进程不必完全加载到物理内存中也可以得到运行。这种方式的一个突出优点就是进程可以使用比熊实际所允许的物理内存大得多的地址空间。另外一个优点是多个进程能够共享的内存以并发的方式运行。 先简单的介绍Linux操作系统存储管理方式,Linux系统采用请求式分页虚拟内原创 2012-12-23 20:10:36 · 4662 阅读 · 0 评论 -
递归函数
一、基本的递归函数 首先先来了解下C程序在内存中的组织方式,基本上来说一个可执行的程序在内存中有4个区域组成:代码段、静态数据区、堆与栈。代码段包含程序运行时所执行的机器指令;静态数据区是包含在程序的生命周期内的一直持续的数据,比如全局变量和静态的局部变量;堆包含程序运行过程中动态分配的存储空间。栈是函数调用过程中所使用的信息。 当C程序调用一个函数是栈会分配一个原创 2012-12-06 23:14:52 · 4128 阅读 · 5 评论 -
C算法-------指针操作
在语言中,指针的重要ixng不言而喻,但很多时候指针被认为是一把双刃剑。一方面,指针是构建数据结构和操作内存的精确而高效的,另一方面,指针是有很容易被程序员误操作,从而造成不必要的BUG。1 、 存储空间分配 当生命一个指针时,通常情况下会分配一个字长的存储空间;当生命一个指针时,仅仅只是为指针本身分配了空间,并未有给指针所指向的数据分配空间,而为数据分配存储空间有两原创 2012-12-02 15:28:31 · 2561 阅读 · 0 评论 -
C算法精解---链表(2)
前面对单链表和双链表的定义和抽象数据类型进行简单的介绍。下面介绍另外一种链表,循环链表。他提供了一种更灵活的遍历链表元素的能力,循环链表可以是单向的也可以是双向的。区分链表是循环链表的主要看他最后一个元素的next指针是不是指向的头元素。下面是以单向链表来介绍。循环链表的实现和分析:#ifndef CLIST_H#define CLIST_H#include /*defin原创 2012-12-19 21:33:56 · 2367 阅读 · 0 评论 -
C 算法精介----链表(1)
C算法 ---链表 链表是一种最为基础的数据结构,链表是由一组元素以一种特定的顺序组合或链接在一起的。在维护数据的集合时很有用途。在平时的数据处理过程中经常会会用链接进行数据的临时存储。但是如何才能使链表处理数据更加优化,下面简单介绍单链表处理情况! 链表反转 1 、单链表介绍 单链表是各个元素之间通过一个指针彼此连接起来而组成...原创 2012-12-14 23:02:38 · 4280 阅读 · 2 评论