当前位置: 首页 > 编程日记 > 正文

C# 算法系列一基本数据结构

一、简介

作为一个程序员,算法是一个永远都绕不过去的话题,虽然在大学里参加过ACM的比赛,没记错的话,浙江赛区倒数第二,后来不知怎么的,就不在Care他了,但是现在后悔了,非常的后悔!!!如果当时好好学算法的话,现在去理解一些高深的框架可能会很easy,现在随着C#基础和Web技能的提升,发现哪里都用到算法,但是,很无奈.所以,从今天开始,要重新对自己定位,不能做一个工具的使用者.起码要做到知其所以然.好了,废话不多说,算法之旅,算是正式开始了.希望这个过程能贯穿我的整个职业生涯.甚至整个人生.

二、队列

关于队列,不多说,只要做了一两年程序员,对他肯定不陌生,可以说哪里都有他.关于他的概念也很简单.类似于我们生活中的排队打饭,当然先排队的肯定先打到饭.专业术语叫做先进先出.下面用基于object数组的C#实现,代码如下:

    /// <summary>/// 自定义队列/// </summary>public class Queue{private object[] _array;/// <summary>/// 队列头/// </summary>private int _head;/// <summary>/// 队列尾/// </summary>private int _tail;/// <summary>/// 当前数组的长度/// </summary>private int _size;/// <summary>/// 使用默认构造函数时,给定队列默认的长度4/// </summary>public Queue() : this(4){}/// <summary>/// 初始化指定容量的队列/// </summary>/// <param name="capacity"></param>public Queue(int capacity){if (capacity < 0){throw new Exception("初始容量不能小于0");}_array = new object[capacity];_head = 0;_tail = 0;_size = 0;}/// <summary>/// 入队/// </summary>public virtual void Enqueue(object obj){_array[_tail] = obj;_tail = _tail + 1;_size++;}/// <summary>/// 出队/// </summary>/// <returns></returns>public virtual object Dequeue(){if (Count == 0){throw new InvalidOperationException("当前队列为空,无法执行Dequeue操作");}object result = _array[_head];_array[_head] = null;_head = _head + 1;_size--;return result;}/// <summary>/// 当前队列的长度/// </summary>public int Count { get { return _size; } }}

控制台调用代码如下:

    class Program{static void Main(string[] args){var q = new Queue();q.Enqueue(1);q.Enqueue(2);q.Enqueue(3);q.Enqueue(4);Console.WriteLine("出队:{0},{1},{2},{3}", q.Dequeue(), q.Dequeue(), q.Dequeue(), q.Dequeue());Console.ReadKey();}}

先进先出,但是有问题,上面给定初始长度为4,所以全局数组的长度为4,当你调用Equeue方法5次,数组会报溢出错误,所以,如果当前队列的长度等于我们给它的初始值时,必须进行一个数组的Copy操作,将当前数组拷贝到一个容量更大的数组中去,这里MS采用的算法时,每次乘以2的递增.修改代码如下:

    /// <summary>/// 自定义队列/// </summary>public class Queue{private object[] _array;/// <summary>/// 队列头/// </summary>private int _head;/// <summary>/// 队列尾/// </summary>private int _tail;/// <summary>/// 当前数组的长度/// </summary>private int _size;/// <summary>/// 使用默认构造函数时,给定队列默认的长度32/// </summary>public Queue() : this(4){}/// <summary>/// 初始化指定容量的队列/// </summary>/// <param name="capacity"></param>public Queue(int capacity){if (capacity < 0){throw new Exception("初始容量不能小于0");}_array = new object[capacity];_head = 0;_tail = 0;_size = 0;}/// <summary>/// 入队/// </summary>public virtual void Enqueue(object obj){if (_array.Length == _size){int capacity = _array.Length * 2;SetCapacity(capacity);}_array[_tail] = obj;_tail = _tail + 1;_size++;}/// <summary>/// 出队/// </summary>/// <returns></returns>public virtual object Dequeue(){if (Count == 0){throw new InvalidOperationException("当前队列为空,无法执行Dequeue操作");}object result = _array[_head];_array[_head] = null;_head = _head + 1;_size--;return result;}/// <summary>/// 当前队列的长度/// </summary>public int Count { get { return _size; } }/// <summary>/// 重新设定原始数组的容量/// </summary>private void SetCapacity(int capacity){var newArray = new object[capacity];Array.Copy(_array,newArray, _array.Length);_array = newArray;_head = 0;_tail = _size;}}

ok,现在每次都会以原数组*2的长度扩展原始数组,但是还是有问题,如果这中间存在出队,实际的_size会减一,但是数组实际的长度还是为原来的,区别就是出队的那个元素的位置会被设置为null,会存在以下bug:

            var q = new Queue();q.Enqueue(1);q.Dequeue();q.Enqueue(2);q.Enqueue(3);q.Enqueue(4);q.Enqueue(5);Console.WriteLine("出队:{0},{1},{2},{3}", q.Dequeue(), q.Dequeue(), q.Dequeue(), q.Dequeue());Console.ReadKey();

出队,导致_size-1,但是原始数组的长度还是为4,千万不要说,Dequeue的时候,让第一个元素的内存释放数组长度变为3,这是不可能的,至少我不知道.所以,这里还需要对算法进行改进.好了,到这里我就做不下去了,看了MS的实现,估计是对数组对了特殊的内存处理,没有办法处理出队后第一个元素为null,但是它还是会算到计算长度里面去,如果引入新的变量去计算实际的长度,不用说,m目测会有内存浪费!mmp.如果你们有好的办法,请告知.

相关文章:

git管理大项目或者大文件

git 是追踪代码库演进的最佳选择&#xff0c;并且它能让你与你的同事间高效协作。当你想要追踪的库非常巨大时会发生什么&#xff1f;在这篇文章里&#xff0c;我会尝试着给你一些想法和技巧来恰当地处理不同种类的大仓库。两种大代码库如果仔细想想&#xff0c;大概会有两种导…

window下java开发环境安装

首先请去Java的官网上下载&#xff0c;最好下载最新版本地址&#xff1a;http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 如图&#xff0c;点击下载java platform&#xff08;JDK&#xff09;,然后选择接受接受协议&#xff08;Accept …

【ACM】蛇形填数

先判断&#xff0c;再移动&#xff0c;而不是发现越界了再退回来。 #include "stdio.h" #include "string.h" #define maxn 20 int a[maxn][maxn]; int main() {int n, x, y, tot 0;scanf_s("%d", &n);memset(a, 0, sizeof(a));tot a[x …

Mybatis中Oracle和Mysql的Count字段问题

Mybatis中Oracle和Mysql的Count字段问题 我们在进行项目开发时经常会碰到查询总数的问题&#xff0c;所以我们直接是用select count(1) from table来进行查询。那么在Mybatis通常情况下我们是这么写的 <select id"testCount" resultType"int">select…

为什么free()时不需要传指针大小

malloc()和free()是c中两个非常基本的函数&#xff0c;但这种最基本的东西往往都是特别复杂的。malloc和free的原形如下&#xff1a;void *malloc(unsigned int num_bytes); void free(void *ptr);在c的标准中并没有定义这两个函数的具体实现&#xff0c;在我们最常用的gcc中&a…

redis cluster 安装配置

一、redis集群安装配置1、下载redis源码包并下载wget http://download.redis.io/releases/redis-3.0.7.tar.gz $ tar xzf redis-3.0.7.tar.gz $ cd redis-3.0.7 yum -y install gcc gcc-c libstdc-devel #解决相关依赖关系$ make && make install 因我们安装redis 集…

【ACM】汉诺塔

https://blog.csdn.net/xueerfei008/article/details/9904681

什么是机器人底盘 答案在这里!

机器人底盘承载了机器人本身的定位、导航及避障等基本功能&#xff0c;可帮助机器人实现智能行走&#xff0c;以思岚科技的ZEUS为例&#xff0c;内置SLAMWARE高性能自主定位导航模块&#xff0c;用户可根据实际需要搭载不同的应用&#xff0c;可广泛适用于餐厅、商场、银行、办…

嵌入式linux内存使用和性能优化

这本书有两个关切点&#xff1a;系统内存(用户层)和性能优化。 这本书和Brendan Gregg的《Systems Performance》相比&#xff0c;无论是技术层次还是更高的理论都有较大差距。但是这不影响&#xff0c;快速花点时间简单过一遍。 然后在对《Systems Performance》进行详细的学…

【算法导论】插入排序

循环不变式 在数学上阐述了通过循环&#xff08;迭代&#xff0c;递归&#xff09;去计算一个累计的目标值的正确性。 关于循环不变式&#xff0c;我们必须要证明三条性质&#xff1a; 初始化&#xff1a;循环第一次迭代之前&#xff0c;它为真。保持&#xff1a;如果循环的…

gdb+gdbserver

内容摘要 远程调试环境由宿主机GDB和目标机调试stub共同构成&#xff0c;两者通过串口或TCP连接。使用 GDB标准程串行协议协同工作&#xff0c;实现对目标机上的系统内核和上层应用的监控和调试功能。调试stub是嵌入式系统中的一段代码&#xff0c;作为宿主机GDB和目标机调试程…

Android开发技巧——去掉TextView中autolink的下划线

我们知道&#xff0c;在布局文件中设置textview的autolink及其类型&#xff0c;这时textivew上会显示link的颜色&#xff0c;并且文字下面会有一条下划线&#xff0c;表示可以点击。而在我们在点击textview时&#xff0c;应用将根据我们所设置的类型跳转到对应的界面。但是有时…

【算法导论】冒泡排序 选择排序

冒泡排序&#xff1a; //从大到小 void bubble_sort(int array[],int len) {int i,j,t;for(i0;i<len-1;i){for(j0;j<len-1-i;j){if(array[j]<array[j1]){tarray[j];array[j]array[j1];array[j1]t;} }} } 选择排序&#xff1a; //从大到小 void select_sort(int a…

监控平台zabbix高级配置

2019独角兽企业重金招聘Python工程师标准>>> 12月26日任务 19.12 添加自定义监控项目 19.13/19.14 配置邮件告警 19.15 测试告警 19.16 不发邮件的问题处理 添加自定义监控项目 zabbix可以自定义监控项目&#xff0c;满足个性化的需求。例如网站注册量、访问量等具体…

linux内存实际占用分析

作者: 黄永兵/译 出处:51CTO.com 阅读提示&#xff1a;本文是为那些经常疑惑的人准备的&#xff0c;“为什么一个简单的KDE文本编辑器要占用25M内存&#xff1f;”导致大多数人认为许多Linux应用程序&#xff0c;特别是KDE或GNOME程序都象ps报告一样臃肿...【51CTO.com独家译文…

CentOS 6.5 下Vim 配置图解

分享个CentOS 6.5 下Vim 配置图文详解&#xff0c;希望对大家有所帮助。 1. 登录并进入你常用的用户名下&#xff0c;查看其主目录 命令&#xff1a; # su xxx $ cd xxx $ ls -a 2.查看并建立目录和文件 首先看你的主目录~/ 下是否有.vimrc文件&#xff0c;没有就输入指令 $ to…

【ACM】杭电OJ 1106 函数atoi

函数atoi是把字符串转化成整数的函数&#xff0c;头文件为 #include "stdlib.h" e.g. 运行环境&#xff1a;Dev-C 5.11 杭电1106 调用了sort函数&#xff0c;运行的时间相对长一些。 #include "stdio.h" #include "string.h" #include "…

docker-dockerfile

docker文件存储驱动dockerfile镜像构建指令示例dockekr镜像是只读的&#xff0c;对容器修改的内容&#xff0c;一旦容器退出&#xff0c;所有的内容将会丢失。镜像是分层的&#xff0c;最上的一层为读写层&#xff08;写时复制和用时分配&#xff09; 文件系统存储驱动&#xf…

proc/[pid]/maps 文件解释

proc/[pid]/maps 文件解释 查看进程的虚拟地址空间是如何使用的。 该文件有6列&#xff0c;分别为&#xff1a; 地址&#xff1a;库在进程里地址范围 权限&#xff1a;虚拟内存的权限&#xff0c;r读&#xff0c;w写,x,s共享,p私有&#xff1b; 偏移量&#xff1a;库在进程里…

【ACM】UVa 1339

【题目】&#xff1a;给定两个长度相同且不超过100的字符串&#xff0c;判断是否能把其中一个字符串的各个字母重排&#xff0c;然后对26个字母做一一映射&#xff0c;使得两个字符串相同。输入两个字符串&#xff0c;输出“YES”或者“NO”。 【分析】&#xff1a;既然字母可…

springBoot PUT请求接收不了参数的解决办法

2019独角兽企业重金招聘Python工程师标准>>> 做项目的时候&#xff0c;想把接口写标准点&#xff0c;于是在更新内容的时候采用put提交内容&#xff0c;但是提交内容时总是获取不到参数&#xff0c;总是选择参数为null。 首先贴出我的put的方法控制器的代码 和之前的…

七牛云内容审核服务被选为「上海首批人工智能创新产品」

近日&#xff0c;上海人工智能应用场景建设实施计划正式发布&#xff0c;这是全国首次面向人工智能应用场景需求的征集计划。上海 10 大人工智能应用场景、19 个具体点位需求和 60 个人工智能创新产品集中首发&#xff0c;其中&#xff0c;上海七牛信息技术有限公司&#xff08…

linux动态库命名规则

说道“动态库版本兼容”&#xff0c;很多人头脑中首先蹦出的就是“Dll Hell”。啊&#xff0c;这曾经让人头疼的难题。时至今日&#xff0c;这个难题已经很好地解决了。 在进一步讨论之前来思考一个问题&#xff1a;Linux下为什么没有让人头痛的“DllHell”&#xff1f; 回答…

如何在同一系统里同时启动多个Tomcat

需要在同一系统里启动多个tomcat,应该怎么处理? tomcat是个服务程序&#xff0c;需要占用几个通讯端口&#xff0c;所以默认情况是不能启动多个tomcat,如果要启动多个tomcat,需要修改配置文件&#xff0c;通过在配置文件设置不同的通讯端口就可以做到.文件 %TOMCAT_HOME%/conf…

【ACM】Uva 455

【题目】&#xff1a;如果一个字符串可以由某个长度为k的字符串重复多次得到&#xff0c;则称该串以k为周期。输入一个长度不超过80的字符串&#xff0c;输出其最小正周期。 注意以下几点&#xff1a; 1、它的最小正周期一定可以被它的长度整除。 2第一个大循环下 i 可以等于…

前端自动化构建工具webpack (二)之css和插件加载总结

1. webpack只识别js文件&#xff0c;其他文件都需要转换成js文件。所有文件都是模块; 2. css解析 css需要css-loader ---》style-loader -----》less-loader less文件还需要less-loader &#xff08;注意书写顺序&#xff09; 3. plugins&#xff1a;他是一个数组&#…

使用command对象操作数据库

1.Command对象查询数据库 protected void Button1_Click(object sender, EventArgs e){//读取web.config节点配置string strcon ConfigurationManager.ConnectionStrings["testjm"].ConnectionString;//实例化sqlConnection对象SqlConnection con new SqlConnectio…

浅析C语言之uint8_t / uint16_t / uint32_t /uint64_t

一、C语言基本数据类型回顾 在C语言中有6种基本数据类型&#xff1a;short、int、long、float、double、char 1、数值类型 1&#xff09;整型&#xff1a;short、int、long 2&#xff09;浮点型&#xff1a;float、double 2、字符类型&#xff1a;char 二、typedef回顾 …

【ACM】UVa 489 刽子手游戏(自顶向下)

【题目】 Hangman Judge是一个猜英文单字的小游戏&#xff08;在电子字典中常会看到&#xff09;&#xff0c;游戏规则如下&#xff1a; 1、答案单字写在纸上&#xff08;每个字元一张纸&#xff09;&#xff0c;并且被盖起来&#xff0c;玩家每次猜一个英文字元&#xff08;le…