![](https://img-blog.csdnimg.cn/direct/77ca158b16304176b187f9442d7c97ee.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
《数据结构和算法》
文章平均质量分 66
基本的一些数据结构,和一些简单的算法,期待一起进步
赫凯
人生如逆旅,我亦是行人。
展开
-
周期性函数算出其周期(python)
在日常生活中,总是会遇见一些周期性的函数,我们可以人眼看出他们是有一定规律的,但是我们不能准确地发现它们的周期是多少。原创 2023-08-21 16:55:04 · 1020 阅读 · 0 评论 -
python KMP算法查找子字符串
最近在刷leecode,碰见字符串检索题。原题是这样的,有两个字符串,一长一短,就看看短的是不是在长的里面,如果在返回第一个字符的下标。因为总忘记,所以记录下我的思路是咋捋顺的,其实看这一篇就够了,从头到尾彻底理解KMP最开始也是想,暴力执法,维护两个下标,一个划长字符串,一个来回遍历段字符串,直接上代码(python 里相对简单,功能比对都做了封装,但是原理一样的)。class Solution: def strStr(self, haystack: str, needle: str)原创 2022-03-25 10:04:13 · 1438 阅读 · 0 评论 -
C 基数排序
基数排序有些许特别,不是上来比较,而是将每个数都分成个位、十位、百位、千位等等等等。先上来比较个位的,可以出来一个序列。再在这个序列列比较十位的,又可以出来一个序列。再百位等等等比较玩最大数字的最高位后,就OK了...原创 2018-11-25 16:43:23 · 388 阅读 · 0 评论 -
C 邻接表变邻接矩阵
我觉得跟输出一下子没啥区别,直接上代码//邻接矩阵存储typedef struct Matrix{ int arr[M][M]; //矩阵 int arc_num; //边的数目 int node_num; //节点的数目 bool is_directed;//是否是有向的}Matrix;//邻接表变邻接矩阵void convertAdj2Marix(G...原创 2018-11-02 19:11:37 · 352 阅读 · 0 评论 -
C 试基于图的深度优先搜索策略写一算法 判别以邻接表方式存储的有向图中是否存在由顶点 vi到顶点 vj的路径 i≠j 。
给大佬跪了,这个是要返回的,但是还要兼顾顶点上连接的其他节点,不能一个不行就不行,所以走的路径只返回走通的,走不通的略过,直到最后,能走到最后就说明根本没有通的路径,就这样。也可以把这个点上的所有连接点用深度遍历走一次,然后看看记录是否点亮的数组里是不是亮着的,亮着就说明是有路径,不亮就没有。严蔚敏 数据结构 7.22。...原创 2018-11-01 09:27:27 · 17885 阅读 · 3 评论 -
C 查找二叉树的基本操作
//// main.c// 二叉排序树//// Created by 赫凯 on 2018/10/31.// Copyright © 2018 赫凯. All rights reserved.//#include <stdio.h>#include <stdlib.h>#include <stdbool.h>typedef int...原创 2018-10-31 17:28:33 · 955 阅读 · 0 评论 -
C 两个二叉树相似不相似
看下这两个树的结构是不是一样的//看两个树是不相似的bool isXiangsi(BiThrTree t1, BiThrTree t2){ //相判断这句,看其是否为空 if (!t1 && !t2) { return true; } //一个有一个没有直接毙了 else if ((t1 && !t...原创 2018-10-27 21:18:00 · 525 阅读 · 0 评论 -
C 二叉树查找值为x的节点,并打印其所有的父节点
思路就跟输出二叉树一样的,只不过这次是找节点文章目录查找节点输出此节点所有的父节点查找节点//找一个值为x的节点BiThrTree findElement(BiThrTree T, ElementType x){ if (!T) return NULL; if (T->data == x){ return T; } ...原创 2018-10-27 10:09:05 · 10068 阅读 · 0 评论 -
C 二叉树的层序遍历
先序中序后序什么的都好说,但是层序遍历费点劲,但也还行之前二叉树基本操作在这里层序遍历就相当于,根节点先进来,再把子节点再都放进来,根节点出去,子节点再将它们的子节点再放进来,它们再出去。就是这样,其实就是个顺序队列,先进先出。代码如下//层序遍历void putout4(BiThrTree T){ //先定个大数组,就像是用数组形式定了二叉树的存储结构 BiThrTre...原创 2018-10-27 08:45:54 · 981 阅读 · 0 评论 -
C 看看L1是不是L2的子链
//结构体typedef struct Node { ElementType data; struct Node * next;} LNode, * LinkNode;//看看L1是不是L2的一个子串Status isChildStr(LinkNode L1, LinkNode L2){ //L2出个前驱和当前,L1出个当前 LinkNode nodel1...原创 2018-10-25 18:55:53 · 781 阅读 · 0 评论 -
C 链表中从第s节点到第e节点的逆置
//结构体typedef struct Node { ElementType data; struct Node * next;} LNode, * LinkNode;//逆置从i到m个节点的串Status reversFromstoe(LinkNode *L, int s, int e){ if(!(*L)->next) return ER...原创 2018-10-25 17:19:00 · 131 阅读 · 0 评论 -
C 链表前n个是不是中心对称就像 arrfrra
前面相关操作在这呢,这个函数依托于此//结构体typedef struct Node { ElementType data; struct Node * next;} LNode, * LinkNode;//链表前n个是不是中心对称Status isSymmertricLink(LinkNode L, int n){ //本来要一个数组是最好的,无奈C语言不支持...原创 2018-10-25 15:57:31 · 192 阅读 · 0 评论 -
C 将一个单链表拆成3个循环链表,其中一个是纯数字,一个纯字母,一个其他字符
前面相关操作在这呢,这个函数依托于此//结构体typedef struct Node { ElementType data; struct Node * next;} LNode, * LinkNode;//将一个单链表拆成3个循环链表,其中一个是纯数字,一个纯字母,一个其他字符Status depositeLink(LinkNode L, LinkNode *L1, ...原创 2018-10-25 15:37:58 · 3314 阅读 · 2 评论 -
C 两个链表中数据节点的数据域为一个字母 ,其中L1包含L2,在L1中找出与L2相等的字串,并将其逆置
//两个链表中数据节点的数据域为一个字母 https://www.ppkao.com/shiti/10246374Status reverseSubLink(LinkNode *L1, LinkNode L2){ //分两步走,先找出L1中L2的字串 //L1: a b c d e f g h i j k l m n o p q r s //L2: f g h i j k...原创 2018-10-25 14:50:39 · 769 阅读 · 5 评论 -
数据结构插眼
找到一个相当棒的演算法笔记,国立台湾师范大学的。 http://www.csie.ntnu.edu.tw/~u91029 真的棒原创 2018-07-10 16:28:23 · 192 阅读 · 0 评论 -
(Swift 实现)AVL树(自平衡搜索二叉树)创建,插入
这个实现起来有点难度了,看动画竟然没有摸出什么规律来,插入的方法前面是一样的,后面又做了调整的。 好吧,这个我终于看了网上的大神才搞明白Swift的代码如何写出来点这里自平衡二叉树避免了,有的时候二叉搜索树会形成链式结构,就好比,我这一串数字都已经排好序了,从小到大,那按着二叉搜索树,添加的话,都是在右边,右边的右边,那就是个链式结构了,这样就不太好了,所以就想着把它改变改变,于是就有了AVL树。原创 2017-03-28 13:39:28 · 623 阅读 · 0 评论 -
(Swift 实现)二叉搜索树 —— 创建,最大,最小,查找,插入,删除,前驱,后继,中序遍历
了解了二叉堆之后,二叉搜索树就好说了,就是一个节点,左边的子节点是不可能比他大的,右边的子节点是一定大于它的,想了半天终于把创建给写好了。直接看代码import UIKitvar str = "二叉搜索树"//这个就不跟前面的完全二叉树一样了,得自己建了类或者结构体了,我建了个类class erchaTreeNote { var data: Int var leftChild:原创 2017-03-24 18:03:40 · 633 阅读 · 1 评论 -
(Swift 实现)二叉堆 —— 创建,增加节点,摘除最大节点
二叉堆其实也就是完全二叉树或者近似完全的二叉树,百科里面讲的是一般用数组来存储,完全二叉树嘛,子节点都是平均分的,不存在一枝特别突兀,这样就可以用数组了,比如父节点是n那子节点就是n/2和n/2+1,所以对给定一个数组,把里面的数字添加到二叉堆里还是稍微的有些容易 直接上代码import UIKitvar str = "二叉堆"var a = [96,79,8,7,67,16,57,80,89,2原创 2017-03-23 14:24:51 · 450 阅读 · 1 评论 -
(Swift 实现)排序 —— 快速排序
其实还是递归,随意选取一个数字,大的放在右边,小的放在左边,然后在左边再找一个数字大的放在右边,小的放在左边,(当然右边也在找)一直到一两个数字为止 上代码,其实思想很简单理解,但是写代码的时候有些坑的避免就酱。在代码里面我注释import UIKitvar str = "快速排序"//我们的测试数据var a = [12,343,123,123,234,3,4,5,4,5,8,2,3,68,3原创 2017-03-23 11:14:10 · 788 阅读 · 0 评论 -
(Swift 实现)排序 —— 归并排序
我的理解,就是把大问题拆成小问题,然后再合并起来就酱 直接上代码,在Swift执行一遍就看见了,终于想出来了,在playground里面执行,又快又方便呢。import UIKitvar str = "Hello, playground"var a = [22,13,5,1,23,4,23,1,23,4,12,54,56,56,34,523,2134,12,21]//这个我想的先把数组分开,分成原创 2017-03-22 18:19:39 · 827 阅读 · 1 评论 -
推荐物品
接上面的相似度,但是必须需要满足一个条件,那就是相似度越高,返回的数值越大看这个例子就是这个表,其中S.x就是其他人的评分乘上权值(相似度),Sim. Sum就是相似度相加,最后一行就是总记得评分除以Sim. Sum。这样就差不多推出了,目标人物的预计评分,这样也可以给他推荐了。物品的相似性就是把人和物品替换就好了原创 2017-01-03 17:50:06 · 385 阅读 · 0 评论 -
相似度的算法(欧几里德距离和皮尔逊算法)
给了我两个东西,每个东西上有不同的特征,那咱们就算算这两个东西的相似的系数吧先说欧几里德距离,按几何意义来讲就是按n个特征给它建立起来n维坐标系,就先说二维吧,二维上就是两个点咯,xy轴,这两个点相似否,就看他的距离咯,于是就求一下两个点的距离,三个特征呢?那就是三维坐标系。由此推广,可以推广到n维。公式:|x| = √( x[1]2 + x[2]2 + … + x[n]2 ) 欧式原创 2016-12-29 21:29:26 · 10312 阅读 · 0 评论 -
Swift 几种排序实现
import UIKitvar str = "Hello, playground"var arry = [12,32,12,43,54,23,54,2,1,65,2,123,3]//插入排序for index in 1..<arry.count { var key = arry[index] var i = index - 1 while (i >= 0 &&原创 2016-11-24 20:49:12 · 749 阅读 · 0 评论 -
稳定排序和不稳定排序
这几天笔试了好几次了,连续碰到一个关于常见排序算法稳定性判别的问题,往往还是多选,对于我以及和我一样拿不准的同学可不是一个能轻易下结论的题目,当然如果你笔试之前已经记住了数据结构书上哪些是稳定的,哪些不是稳定的,做起来应该可以轻松搞定。本文是针对老是记不住这个或者想真正明白到底为什么是稳定或者不稳定的人准备的。 首先,排序算法的稳定性大家应该都知道,通俗地讲就是能保证排序前2个相转载 2014-10-03 12:08:25 · 432 阅读 · 0 评论 -
九大内部排序汇总
插入排序名称稳定性时间复杂度空间复杂度直接插入排序稳定O(n2)O(1)折半插入排序稳定O(n2)O(1)希尔排序不稳定O(n2) [特定n( n1.3 )]O(1)交换排序名称稳定性时间复杂度空间复杂度冒泡排序稳定O(n2)O(1)快速排序不稳定O(n2)O(n) 平均O(nLog2...原创 2018-11-25 17:10:42 · 280 阅读 · 0 评论 -
C 归并排序
有点点像希尔排序的整齐版 但是更像快速排序如果有两个有序的数组合并成一个的话会省下好多时间,那我就把一个数组分成两个,每个弄成有序的。那…我把分下的两个数组,再按这个这个办法,一直分下去,直到一个子数组里面只有一个元素,再合合合起来。分————治————合老师还给您的知识,我今天再拿回来吧...原创 2018-11-25 16:35:52 · 1182 阅读 · 0 评论 -
C 堆排序
首先找一个树,将数组按从上到下,从左到右的顺序插在树里,本着根节点要大于两个叶子节点,对树进行调整,输出时,直接拿最上面的根节点,它肯定最大(或者最小),接着就按着原来的规则调整树,调整好了,最上面的肯定又是最大(或者最小),这样就得到有序的序列了。...原创 2018-11-24 19:14:21 · 612 阅读 · 0 评论 -
C 简单选择排序
这个简单,在后面没有排好序的序列里,找一个里面最小的跟序列里最开始的那个元素交换void SelectSort(int a[], int n){ int i, min, j, temp; for (i = 0; i < n-1; i++) { min = i; //标记当前的下标 //从后面的序列里找一个最小的出来 for (...原创 2018-11-19 20:16:35 · 262 阅读 · 0 评论 -
C 希尔排序
希尔排序有点麻烦了,我理解就是为什么每次要和前面一个数比大小来确定触发调动条件,而且每次也就一步一步地走?我可不可以每次大步大步地走,一次走3个,相应的我一次也隔3个比一次。最后这个步长越来越小,直到为1个。下面这个图很厉害,网上的侵删。将数组划分成长度很小的多个小组,小组内排好序,再稍微加大小组的长度,再排一次,知道这个小组成为数组的本体void ShellSort(int a[], i...原创 2018-11-19 20:05:06 · 531 阅读 · 0 评论 -
C 折半插入排序
在直接插入的时候,为了给被插入值找到合适的位置,就比较一次,直接决定其往挪走还是不走,比较➕移动,就是两次了。折半将比较和移动分离,先折半找出位置再统一移动。和直接插入一样的,仅仅优化了找位置的算法。void InsertSort(int a[], int n) { int i, j, low, high, mid, temp; for (i = 1; i < n; i...原创 2018-11-19 19:17:17 · 346 阅读 · 0 评论 -
C 直接插入排序
就相当于把整个数列吊起来,然后一个一个上,每次进入的时候,都保证插入之后是有序的void insertSort(int a[], int n){ int i, j, temp; //从第二个开始走,走到最后 for (i = 1; i <= n; i++) { //要是后一个比前一个小就触发调整机制 if (a[i] < ...原创 2018-11-19 19:02:16 · 252 阅读 · 0 评论 -
C 快速排序
快速排序就是对冒泡法进行一种改进,基本思想基于分治法,在L[1…n]选一个数为基准,比他小的往前,比他大的往后,这样得到两个L,在这个两个L中继续挑基准,小的往前,大的往后,循序往复,知道只有一个数字就OK了。代码如下//选择排序int Pratition(int a[], int low, int high){ int pivot = a[low]; while (low ...原创 2018-11-15 19:40:44 · 269 阅读 · 0 评论 -
C 冒泡排序
简而言之就是往上冒泡泡冒泡排序,顾名思义,就是相邻的两项不断地比较,要是条件成熟就互换,就这样。//冒泡void BubbleSort(int a[], int n){ int i, j, temp, flag = 1; //n个数,一共跑n-1趟就好了,n-1个就拍好了,最后一个肯定是好的 for (i = 0; i < n-1; i++) { ...原创 2018-11-12 21:22:13 · 1360 阅读 · 0 评论 -
C 图 邻接表的基本操作
大家可以看看,同胞写的,讲的特别清楚图 – 我的理解就是若干个节点,再加上他们之间的联系;这样就是两块内容,一个放节点,一个放他们的关系。最直观就是弄一个二维数组,行列为1的就是连着的,为0就是没有。但是太占空间了,于是就有了这样的,前面一列就是所有顶点排列,后面每个顶点跟着的就是和这个顶点连着的节点。根据这个理解,就可以把邻接表弄的七七八八了//// main.c// 图邻...原创 2018-10-30 18:00:19 · 4159 阅读 · 0 评论 -
C 二叉树的一些操作
今天不开森,自行车在楼下被偷了文章目录二叉树的创建二叉树的先许遍历二叉树的中序遍历二叉树的后序遍历看看有多少个叶子节点总共有多少个节点二叉树的高度度为1的节点个数度为2的节点个数交换左右子树二叉树的创建//先序创建二叉树void CreatBinarTreeNode(BiThrTree *T){ char c; scanf(&quot;%c&quot;, &amp;amp;c); //输出空格...原创 2018-10-26 19:50:29 · 283 阅读 · 0 评论 -
C 有头结点链表的若干操作
比无头节点的要简单很多文章目录创建输出访问第i个元素在i个位置前插入删除第i个元素头插尾插整体代码创建typedef struct Node { int data; struct Node * next;} LNode, * LinkNode;//创建,丝毫不用理会第一个节点特殊情况void creatLink(LinkNode * q){ int i; ...原创 2018-10-23 20:56:13 · 857 阅读 · 0 评论 -
C 队列的基本操作
//// main.c// 队列//// Created by 赫凯 on 2018/10/30.// Copyright © 2018 赫凯. All rights reserved.//#include <stdio.h>#include <stdlib.h>typedef char Elemtype;typedef struct QNo...原创 2018-10-31 10:36:11 · 351 阅读 · 0 评论 -
C 无头结点单链表若干操作
顾名思义就是从一开就是有用的结点文章目录定义结构体创建定义结构体typedef struct Node { int element; struct Node *next;}LNode, * LinkNode;创建这里是手输入,输入为0的时候就退出来//传入一个头指针的地址void create(LinkNode *head){ //这里就用p1, p2循环插入即...原创 2018-10-22 15:35:58 · 512 阅读 · 0 评论 -
C 栈的基本操作
直接上代码//// main.c// 栈的操作//// Created by 赫凯 on 2018/10/25.// Copyright © 2018 赫凯. All rights reserved.//#include &lt;stdio.h&gt;#include &lt;stdlib.h&gt;#define STACK_INIT_SIZE 100#defi...原创 2018-10-31 09:19:30 · 570 阅读 · 0 评论 -
C 顺序列表若干操作
顺序表我理解解决了c中的数组不可变长度问题,在其他语言数组都是随时增加的,不会这样子//// main.c// C顺序表//// Created by 赫凯 on 2018/10/20.// Copyright © 2018年 赫凯. All rights reserved.//#include <stdio.h>typedef struct Seqlis...原创 2018-10-20 11:28:01 · 329 阅读 · 0 评论