数据结构与算法
杨博东的博客
阿里云数据库-NoSQL组,开源贡献者,Valkey Contributor,Valkey-Java Client Maintainer。
展开
-
"递归"实现"约瑟夫环","汉诺塔"
一:约瑟夫环问题是由古罗马的史学家约瑟夫提出的,问题描述为:编号为1,2,….n的n个人按顺时针方向围坐在一张圆桌周围,每个人持有一个密码(正整数),一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始报数,报到m时停止报数,报m的那个人出列,将他的密码作为新的m值,从他顺时针方向的下一个人开始重新从1报数,数到m的那个人又出列;如此下去,直到圆桌周围的人全部出列为止。一般情况下原创 2015-11-05 08:42:44 · 1194 阅读 · 0 评论 -
负载均衡算法WRR介绍
一、负载均衡负载均衡是一个很大的概念,既有从硬件层面来解决问题的,又有从软件层面解决的,有关负载均衡的介绍,推荐阅读: http://os.51cto.com/art/201108/285359.htm, 本文主要介绍负载均衡算法中很简单的一种WRR(Weighted Round Robin),加权轮训调度算法,并且配合实现以及对它存在问题进行分析和提出一些优化策略。二、原始的WRR算法假设有3台原创 2017-06-18 18:17:56 · 18246 阅读 · 6 评论 -
哈夫曼树的构建 哈夫曼编码
哈夫曼树:给定n个权值作为n的叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。 哈夫曼编码:在数据通信中,需要将传送的文字转换成二进制的字符串,用0,1码的不同排列来表示字符。例如,需传送的报文为“AFTER DATA EAR ARE ART AREA”,这里用到的字符原创 2015-11-22 22:48:17 · 2363 阅读 · 0 评论 -
为什么Hashtab的大小通常取远离2^n 的素数
举个栗子在Hashtab中我们通常 Hash(key) % M 来确定 key 所需要存放的位置M就是Hashtab的大小,假设下面的两个场景Hash(key1) = 108 Hash(key2) = 500 如果 M 恰好是 2^n,我们在这里假设M为2^3=8则 Hash(key1) % M = 108 % 8 = 4Hash(key2) % M = 500% 8 = 4此时最后的结果原创 2017-03-11 10:27:25 · 711 阅读 · 0 评论 -
CODEVS 1576 最长严格上升子序列
题目链接 1576 最长严格上升子序列题意 找出一个序列中上升子序列 例如 2 1 5 3 6 4 8 9 7 上升子序列:1 5 6 8 9 或者 1 3 4 8 9 但是子序列长度都是5思路 有两种想法:一是动归,一是每次从前往后找第一大并且替换。这样做的能得到最长序列的次数,但是无法知道最长序列是什么。代码动归#include<iostream>using st原创 2016-03-31 23:58:15 · 1001 阅读 · 0 评论 -
图邻接表存储 深度优先和广度优先遍历
邻接表 是图的常用储存结构之一。邻接表由表头结点和表结点两部分组成,其中图中每个顶点均对应一个存储在数组中的表头结点。如图: 下面直接上代码:#include<stdio.h>#include<stdlib.h>#include"my_queue.h"int visit[MAXSIZE] = {0}; //作为输出判断数组AdjList *build_Gra原创 2015-11-27 20:18:06 · 2696 阅读 · 1 评论 -
哈夫曼原理应用--压缩文件
一:思路由于用java中的.read()方法读文件返回值是一个0-255之间的数,因此记录下每一个数字出现的频率并将它作为权值就可构建一棵哈夫曼树,根据构建的哈夫曼树我们获得相应字符的编码,然后通过将二进制8位一组转换成一个字符存储,这样就可以使空间变为2进制码文件的1/8,但是由于二进制本身就将文件扩大,因此压缩不是很理想。大约压缩40%-60%;。二:遇到的问题1:压缩之后存入的实际上是二进制转原创 2015-12-24 18:11:32 · 1154 阅读 · 0 评论 -
栈和队列的应用之"表达式求值"和"魔王语言"
一:魔王语言[问题描述] 有一个魔王总是使用自己的一种非常精练而又抽象的语言讲话,没有人能听得懂,但他的语言是可以逐步解释成人能听懂的语言,因为他的语言是由以下两种形式的规则由人的语言逐步抽象上去的: (1) α -> β1β2…βm (2)(θδ1δ2…δn)->θ δn θδn-1…θδ1 θ 在这两种形式中,从左到右均表示解释。试写一个魔王语言的解释系统,把他的话解释成人能听得原创 2015-11-14 23:38:54 · 990 阅读 · 0 评论 -
三元组创建矩阵 一次定位快速转置 矩阵的加法、减法、乘法
首先说说我们经常见到或者使用的矩阵: (1):三角矩阵:对角线一侧的元素没有限制,另一侧全为0或者常数c。常见的有上三角矩阵和下三角矩阵。 (2):对角矩阵:对角矩阵是指有效元素集中在对角线两侧,我们常用的三对角矩阵来将矩阵的压缩。三对角矩阵指的是三条对角线以外的元素均为0。 (3):稀疏矩阵:指的是矩阵中非零元素的个数低于矩阵中元素总个数的%25。 正是因为稀疏矩阵的这个性质,我们才可以将原创 2015-11-22 16:51:12 · 4092 阅读 · 0 评论 -
非递归创建二叉树 先序 中序 后序遍历
思想:用”栈”来消除递归。主要是建立的过程,刚开始卡到了如果遇到’#’,那么在else中间出栈之后还需要读一个元素,这样在遇到连续的”#”之后,退栈并不能达到合适的位置,最后听了“巅峰”的建议,还是设置了flag,解决了问题,下面解释下建立过程的思想: 1:正常情况下以先序的方式输入串。一个一个字符读取;如果第一个字符不为“#”,先将它入栈,即我们的根。 2:初始化flag = 0,如果没原创 2015-11-22 17:11:50 · 1763 阅读 · 1 评论 -
排序算法 快速排序 归并排序 堆排序
一:插入排序思想:在对整个数组循环for(i = 0;i < n;i++)的过程中,保证此时走到的i位置的前面已经是一个有序序列,所以对于i位置的处理就是由i位置依次向前,找到第一个不满足大于此时i位置的元素的位置,插入即可。 #include<stdio.h>void Insert(int a[],int n) //a是待排序数组,n是数组大小{ int i,j;原创 2015-12-14 18:45:21 · 1655 阅读 · 0 评论 -
字符串的简单处理
其实我认为计算机存储的东西有两类,一类是数据,一类是字符串,我不想将字符与数据看做一个东西,对于字符需要处理的地方非常多,比如匹配,替换,删除,修改等等,下面我总结下自己今天写的有关字符串处理的几个函数: StrAssign(chars); //构建一个串S StrCopy(&S,chars); //将chars串拷贝给S StrLength(S,&ret); //ret的值就是数组原创 2015-11-19 08:23:26 · 596 阅读 · 0 评论 -
回溯法的典型问题 八皇后 马踏棋盘 迷宫
所谓回溯就是”一条路走到黑,不通退几步,能走则走,啥时走完啥时了!”一:八皇后 八皇后问题是一个经典的问题,在一个8*8的棋盘上放置8个皇后,每行一个并使其不能互相攻击(同一行、同一列、同一斜线上的皇后都会自动攻击)。#include<iostream>#include<cmath>#define INIT -10000 //定义初始化数据using std::cout;using s原创 2016-02-26 21:47:07 · 2080 阅读 · 0 评论