自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

时光隧道

qq:2528877987,微信:13960699696

  • 博客(223)
  • 收藏
  • 关注

原创 (精华)2020年8月31日 计算机操作系统 IO概念和五种IO模型

一、什么是IO?我们都知道unix世界里、一切皆文件、而文件是什么呢?文件就是一串二进制流而已、不管socket、还是FIFO、管道、终端、对我们来说、一切都是文件、一切都是流、在信息交换的过程中、我们都是对这些流进行数据的收发操作、简称为I/O操作(input and output)、往流中读出数据、系统调用read、写入数据、系统调用write、不过话说回来了、计算机里有这么多的流、我怎么知道要操作哪个流呢?做到这个的就是文件描述符、即通常所说的fd、一个fd就是一个整数、所以对这个整数的操作、就是对

2020-08-31 16:18:53 417158

原创 (精华)2020年8月31日 .NET 内存溢出

内存溢出的几种情况一:事件驱动原因事件对象没有被释放,或者一直引用着class TestClassHasEvent { public delegate void TestEventHandler(object sender, EventArgs e); public event TestEventHandler YourEvent; protected void OnYourEvent(EventArgs e)

2020-08-31 00:02:58 420894

原创 (精华)2020年8月30日 通用职责分配原则(二)-创造者原则(Creator Principle)

创造者原则(Creator Principle)(1)问题谁应该负责产生类的实例?(2)方案如果符合下面的一个或者多个条件,则可将创建类A实例的职责分配给类B:B包含A;B聚合A;B拥有初始化A的数据并在创建类A的实例时将数据传递给类A;B记录A的实例;B频繁使用A。此时,我们称类B是类A对象的创建者。如果符合多个条件,类B聚合或者包含类A的条件优先。(3)分析创建对象是面向对象系统中最普遍的活动之一,因此,确定一个分配创建对象的通用职责非常重要。如果职责分配合理,设计就能降低耦合,

2020-08-31 00:02:48 420873

原创 (精华)2020年8月30日 通用职责分配原则(九)-受保护变量原则(Protected Variations Principle)

受保护变量原则(Protected Variations Principle)(1)问题如何分配职责给对象、子系统和系统,使得这些元素中的变化或不稳定的点不会对其他元素产生不利影响?(2)方案找出预计有变化或不稳定的元素,为其创建稳定的“接口”而分配职责。(3)分析受保护变化模式简称PV,它是大多数编程和设计的基础,是模式的基本动机之一,它使系统能够适应和隔离变化。它与面向对象设计原则中的开闭原则相对应,即在不修改原有元素(类、模块、子系统或系统)的前提下扩展元素的功能。开闭原则又可称为“可变性

2020-08-31 00:02:38 420945 1

原创 (精华)2020年8月30日 通用职责分配原则(八)-中介原则(Indirection Principle)

中介原则(Indirection Principle)(1)问题1、如何分配职责以避免两个(或多个)事物之间的直接耦合?2、如何解耦对象以降低耦合度并提高系统的重用性?(2)方案 分配职责给中间对象以协调组件或服务之间的操作,使得它们不直接耦合。中间对象就是在其他组件之间建立的中介。(3)分析 要避免对象之间的直接耦合,最常用的做法是在对象之间引入一个中间对象或中介对象,通过中介对象来间接相连。中介模式对应于面向对象设计原则中的迪米特法则,在外观模式、代理模式、中介者模式等设计模式中都体现了中介原

2020-08-31 00:02:27 420815

原创 (精华)2020年8月30日 通用职责分配原则(七)-纯虚构原则(Pure Fabrication Principle)

纯虚构原则(Pure Fabrication Principle)(1)问题当不想破坏高内聚和低耦合的设计原则时,谁来负责处理这种情况?(2)方案将一组高内聚的职责分配给一个虚构的或处理方便的“行为”类,它并不是问题域中的概念,而是虚构的事务,以达到支持高内聚、低耦合和重用的目的。(3)分析纯虚构模式用于解决高内聚和低耦合之间的矛盾,它要求将一部分类的职责转移到纯虚构类中,在理想情况下,分配给这种虚构类的职责是为了达到高内聚和低耦合的目的。在实际操作过程中,纯虚构有很多种实现方式,例如将数据库操

2020-08-31 00:02:01 420901

原创 (精华)2020年8月30日 通用职责分配原则(六)-多态原则(Polymorphism Principle)

多态原则(Polymorphism Principle)(1)问题1、如何处理基于类型的不同选择?2、如何创建可嵌入的软件组件?(2)方案当相关选择或行为随类型(类)变化而变化时,用多态操作为行为变化的类型分配职责。(3)分析由条件变化引发同一类型的不同行为是程序的一个基本主题。如果用if-else或switch-case等条件语句来设计程序,当系统发生变化时必须修改程序的业务逻辑,这将导致很难方便地扩展有新变化的程序。另外对于服务器/客户端结构中的可视化组件,有时候需要在不影响客户端的前提下

2020-08-31 00:01:45 420846

原创 (精华)2020年8月30日 通用职责分配原则(五)-控制器原则(Controller Principle)

控制器原则(Controller Principle)(1)问题谁应该负责处理一个输入系统事件?(2)方案把接收或者处理系统事件消息的职责分配给一个类。这个类可以代表:整个系统、设备或者子系统;系统事件发生时对应的用例场景,在相同的用例场景中使用相同的控制器来处理所有的系统事件。(3)分析一个控制器是负责接收或者处理系统事件的非图形用户界面对象。一个控制器定义一组系统操作方法。在控制器模式中,要求系统事件的接收与处理通常由一个高级类来代替;一个子系统需要定义多个控制器,分别对应不同的事务处理

2020-08-31 00:01:32 420897

原创 (精华)2020年8月30日 通用职责分配原则(四)-高内聚原则(High Cohesion Principle)

高内聚原则(High Cohesion Principle)(1)问题怎样使得复杂性可管理?(2)方案分配一个职责,使得保持高内聚。(3)分析内聚是评价一个元素的职责被关联和关注强弱的尺度。如果一个元素具有很多紧密相关的职责,而且只完成有限的功能,则这个元素就具有高内聚性。此处的元素可以是类,也可以是模块、子系统或者系统。在一个低内聚的类中会执行很多互不相关的操作,这将导致系统难于理解、难于重用、难于维护、过于脆弱,容易受到变化带来的影响。因此我们需要控制类的粒度,在分配类的职责时使其内聚保持

2020-08-31 00:01:18 420874

原创 (精华)2020年8月30日 通用职责分配原则(三)-低耦合原则(Low Coupling Principle)

低耦合原则(Low Coupling Principle)(1)问题怎样支持低的依赖性,减少变更带来的影响,提高重用性?(2)方案分配一个职责,使得保持低耦合度。(3)分析耦合是评价一个系统中各个元素之间连接或依赖强弱关系的尺度,具有低耦合的元素不过多依赖其他元素。此处的元素可以是类,也可以是模块、子系统或者系统。具有高耦合的类过多地依赖其他类,这种设计将会导致:一个类的修改导致其他类产生较大影响;系统难以维护和理解;系统重用性差,在重用一个高耦合的类时不得不重用它所依赖的其他类。因此需要对高耦

2020-08-31 00:01:04 420837

原创 (精华)2020年8月30日 通用职责分配原则(一)-信息专家原则(Information Expert Principle)

信息专家原则(Information Expert Principle)(1)问题给对象分配职责的通用原则是什么?(2)方案将职责分配给拥有履行一个职责所必需信息的类,即信息专家。(3)分析信息专家原则是面向对象设计的最基本原则。通俗点来讲,就是一个类只做自己应该做的事。在系统设计时,需要将职责分配给具有实现这个职责所需要信息的类。信息专家原则对应于面向对象设计原则中的单一职责原则。示例public class AES { public string Decrypt(string

2020-08-30 00:05:05 421822

原创 (精华)2020年8月30日 面向对象设计原则(七)-迪米特法则(Law of Demeter or LoD)

迪米特法则(Law of Demeter or LoD)一个软件实体应当尽可能少的与其他实体发生相互作用。每一个软件单位对其他的单位都只有最少的知识,而且局限于那些与本单位密切相关的软件单位。如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中的一个类需要调用另一个类的某一个方法的话,可以通过中间类(MeDiator)来转发这个调用。示例public class OnlineShopping { public void AddToCart() { C

2020-08-30 00:04:49 421793

原创 (精华)2020年8月30日 面向对象设计原则(六)-合成复用原则(Composite Reuse Principle or CRP)

合成复用原则(Composite Reuse Principle or CRP)尽量使用对象组合,而不是继承来达到复用的目的。合成复用原则是鼓励优先使用对象的组合,而不是使用继承。示例public abstract class BankCard { public string UserName { get; set; }//用户名 public string Balance { get; set; }//余额 public abstract void Transfer(B

2020-08-30 00:04:35 421759

原创 (精华)2020年8月30日 面向对象设计原则(五)-接口隔离原则(Interface Segregation Principle or ISP)

接口隔离原则(Interface Segregation Principle or ISP)客户端不应该依赖它不需要的接口。一个类对另外一个类的依赖性应当是建立在最小的接口上的。示例public abstract class InvoiceBase { string InvoiceCode { get; set; } string InvoiceNumber { get; set; }}public interface IInvoice { bool Create

2020-08-30 00:04:13 421785

原创 (精华)2020年8月30日 面向对象设计原则(四)-依赖倒置原则(Dependence Inversion Principle DIP)

依赖倒置原则(Dependence Inversion Principle DIP )高层模块不应该依赖低层模块,他们都应该依赖于抽象;抽象不应该依赖于细节,细节应该依赖于抽象。简单的定义为:面向接口(抽象)编程,不要面向实现编程。什么是高层模块?简单地说,就是封装的层级高,我们就认为其是高层模块。Customer类是一个客户类,该客户包含UnlockPhone解锁手机方法,该方法需要传递一个XiaoMiPhone的手机类以便解锁手机,那么Customer类就是高层模块,XiaoMiPhone类就是低

2020-08-30 00:03:56 421742

原创 (精华)2020年8月30日 面向对象设计原则(三)-里氏替换原则(Liskov Substitution Principle or LSP)

里氏替换原则(Liskov Substitution Principle or LSP)所有引用基类的地方必须透明的使用其子类的对象。在代码中将基类对象转换成其子类对象,不应当产生任何错误或异常。示例namespace Liskov;public abstract class Shape { public abstract double Area(); public abstract void Draw(); public virtual void ShowMessa

2020-08-30 00:03:43 421803

原创 (精华)2020年8月30日 面向对象设计原则(二)-开放闭合原则(Open-Closed Principle or OCP)

开放闭合原则(Open-Closed Principle or OCP)开放闭合原则又叫开闭原则,即软件实体应当对扩展开放,对修改封闭。开闭原则就是指软件实体应当尽量保证在不修改原有代码的情况下,对软件进行扩展。开闭原则是面向对象设计的基石。示例public interface IMobilePhone { decimal Price { get; set; } string Model { get; set; } Color Color { get; set; }}

2020-08-30 00:03:27 421856

原创 (精华)2020年8月30日 二十三种设计模式(二十三)-访问者模式(Vistor Pattern)

访问者模式(Vistor Pattern)访问者模式属于行为型模式,表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作。结构对象是使用访问者模式必备条件,而且这个结构对象必须存在遍历自身各个对象的方法。角色1、抽象访问者(Visitor)为该对象结构中具体元素角色声明一个访问操作接口。该操作接口的名字和参数标识了发送访问请求给具体访问者的具体元素角色,这样访问者就可以通过该元素角色的特定接口直接访问它;2、具体访问者(Concrete Visi

2020-08-30 00:02:53 421754

原创 (精华)2020年8月30日 二十三种设计模式(二十二)-模板方法模式(Template Method Pattern)

模板方法模式(Template Method Pattern)模板方法模式属于行为型模式,定义一个模板结构,将具体内容延迟到子类去实现。在不改变模板结构的前提下在子类中重新定义模板中的内容。角色1、抽象类(Abstract Class)实现了模板方法,定义了算法的框架;2、具体类(Concrete Class)实现抽象类中的抽象方法,以完成完整的算法。示例命名空间TemplateMethod中包含DataSource数据源抽象类,其中有一些实例方法、抽象方法和钩子方法(IsNotJson

2020-08-30 00:02:44 421775

原创 (精华)2020年8月30日 二十三种设计模式(二十一)-策略模式(Stragety Pattern)

策略模式(Stragety Pattern)策略模式属于行为型模式,它定义了一系列的算法,并将每一个算法封装起来,而且使他们可以相互替换,让算法独立于使用它的客户而独立变化。使用策略模式可以把行为和环境分割开来。环境类负责维持和查询行为类,各种算法则在具体策略类中提供。角色1、抽象策略(Strategy)这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口;2、具体策略(Concrete Strategy)实现抽象策略的具体策略类,包装了相关的算法或行为;3、环

2020-08-30 00:02:23 421949

原创 (精华)2020年8月29日 二十三种设计模式(二十)-状态模式(State Pattern)

状态模式(State Pattern)状态模式属于行为型模式,它允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化。角色1、抽象状态(State)状态模式的核心基类,它表示某种对象的不同状态;2、具体状态(Concrete State)实现抽象状态的具体状态类;3、环境类(Context)拥有状态的具体对象,该对象会根据内部不同的

2020-08-29 09:02:23 422457

原创 (精华)2020年8月29日 二十三种设计模式(十九)-观察者模式(Observer Pattern)

观察者模式(Observer Pattern)观察者模式属于行为型模式,有时又被称为模型-视图(Model-View)模式、发布-订阅(Publish-Subscribe)模式、源-监听器(Source-Listener)模式或从属者(Dependents)模式。观察者模式完美的将观察者和被观察的对象分离开,并在目标物件状态改变时主动向观察者发出通知(接口方法、抽象方法、委托、事件)。观察者模式在模块之间划定了清晰的界限,提高了应用程序的可维护性和重用性。角色1、抽象主题(Subject)主题需要

2020-08-29 08:59:20 422491

原创 (精华)2020年8月29日 二十三种设计模式(十八)-备忘录模式(Memento Pattern)

备忘录模式(Memento Pattern)备忘录模式属于行为型模式,在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。备忘录模式为我们提供了“后悔药”的机制,为我们在需要的时候,可以将对对象的修改撤销甚至重做。角色1、原发器(Originator)创建一个备忘录,用以记录当前时刻它的内部状态,在需要时使用备忘录恢复内部状态;2、备忘录(Memento)将原发器对象的内部状态存储起来;3、备忘录管理者(Caretaker)

2020-08-29 08:55:40 422431

原创 (精华)2020年8月29日 二十三种设计模式(十七)-中介者模式(Mediator Pattern)

中介者模式(Mediator Pattern)中介者模式属于行为型模式,它包装了一系列对象相互作用的方式,使得这些对象不必相互明显作用,从而使它们可以松散耦合。当某些对象之间的作用发生改变时,不会立即影响其他的一些对象之间的作用,保证这些作用可以彼此独立的变化。角色1、抽象中介者(Mediator):定义统一的接口用于各同事角色之间的通信,其中主要方法是一个(或多个)事件方法;2、具体中介者(Concrete Mediator):实现了抽象中介者所声明的事件方法。具体中介者知晓所有的具体同事类

2020-08-29 08:51:41 422402

原创 (精华)2020年8月29日 二十三种设计模式(十六)-迭代器模式(Iterator Pattern)

迭代器模式(Iterator Pattern)迭代器模式属于行为型模式,它提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示,这样既可以做到不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据。角色1、迭代器(Iterator)迭代器角色负责定义访问和遍历元素的接口;2、具体迭代器(Concrete Iteraror)具体迭代器角色实现了迭代器接口,并需要记录遍历中的当前位置;3、聚合(Aggregate)聚合角色负责定义获得迭代器角色的接口;4、具体聚合(C

2020-08-29 08:48:31 422414

原创 (精华)2020年8月29日 二十三种设计模式(十五)-解释器模式(Interpreter Pattern)

解释器模式(Interpreter Pattern)解释器模式属于行为型模式,给定一个语言,定义它的文法表示,并定义一个解释器,这个解释器使用该标识来解释语言中的句子。解释器模式提供了评估语言的语法或表达式的方式。这种模式实现了一个表达式接口,该接口解释一个特定的上下文。这种模式被广泛地应用在 SQL 解析、符号处理引擎等领域。角色1、抽象表达式(Expression)声明一个所有的具体表达式角色都需要实现的抽象接口。这个接口一般是一个Interpret()方法,称做解释操作;2、终结符表达式(

2020-08-29 08:44:27 422425

原创 (精华)2020年8月29日 二十三种设计模式(十四)-命令模式(Command Pattern)

命令模式(Command Pattern)命令模式属于行为型模式,它尝试将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。在该设计模式中,请求以命令的形式包裹在对象中并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象请求执行。角色1、抽象命令(Command)定义命令的接口,声明命令执行的方法;2、具体命令(Concrete Command)命令接口实现对象,需要维持对接收者的引用,并调用接收者的功能来完成命令要执行的操作;3、接收者(Rece

2020-08-29 08:36:24 422480

原创 (精华)2020年8月29日 二十三种设计模式(十三)-职责链模式(Chain of Responsibility Pattern)

职责链模式(Chain of Responsibility Pattern)职责链模式属于行为型模式,它为请求创建了一个接收者对象的链。这种模式给予一个具体请求的类型,对请求的发送者和接收者进行解耦。通常有2种方法来实现该模式。第1种是每个接收者都包含对下一个接收者的引用,以便在不能处理该请求时,转派请求至下一个接收者。第2个方法是引入中间链条类,由中间件负责转派请求。第一种方法的实现较为简单,本例采用第2种实现方式。角色1、抽象处理者(Handler)定义出一个处理请求的接口。接口可以定义出一个

2020-08-29 08:31:15 422414

原创 (精华)2020年8月29日 二十三种设计模式(十二)-代理模式(Proxy Pattern)

代理模式(Proxy Pattern)代理模式属于结构型模式,为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。角色1、抽象主题(Subject)通过接口或抽象类声明真实角色实现的业务方法;2、代理主题(Proxy)真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作;3、真实主题(Real Subject)定义真实角色所要实现的业务逻辑,供代理角色调用。示例

2020-08-29 08:27:42 422423

原创 (精华)2020年8月29日 二十三种设计模式(十一)-享元模式(Flyweight Pattern)

享元模式(Flyweight Pattern)享元模式属于结构型模式,它以共享的方式高效的支持大量的细粒度对象。通过复用内存中已存在的对象,降低系统创建对象实例的性能消耗。享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象,如果找到对象,则直接返回。角色1、抽象享元(Flyweight)它是所有具体享元类的抽象基类,为其子类规定出需要实现的公共接口;2、具体享元(Concrete Flyweight)具体享元类实现了抽象享元类所规定的接口;3、享元工厂(FlyweightFa

2020-08-29 08:19:08 422443

原创 (精华)2020年8月28日 二十三种设计模式(零)-简单工厂模式(Simple Factory Pattern)

简单工厂模式属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GoF设计模式之一。学习简单工厂模式是学习其它工厂模式的前提条件。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。角色1、工厂(Creator)简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类的创建产品类的方法可以被外界直接调用,创建所需的产品对象;2、抽象产品(Product)

2020-08-28 15:34:11 428757

原创 (精华)2020年8月28日 数据结构与算法解析(哈希查找)

哈希查找的实际目的其实非常简单,就是利用空间换时间.哈希技术是在记录的存储位置和记录的关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key)。查找时,根据这个确定的对应关系找到给定值的映射f(key),若查找集合中存在这个记录,则必定在f(key)的位置上。哈希技术既是一种存储方法,也是一种查找方法。示例:namespace HashSearch.CSharp{ class Program { //初始化哈希表 stati

2020-08-28 15:14:45 428722

原创 (精华)2020年8月28日 数据结构与算法解析(分块查找)

分块查找要求是顺序表,分块查找又称索引顺序查找,它是顺序查找的一种改进方法。将n个数据元素"按块有序"划分为m块(m ≤ n)。每一块中的结点不必有序,但块与块之间必须"按块有序";即第1块中任一元素的关键字都必须小于第2块中任一元素的关键字;而第2块中任一元素又都必须小于第3块中的任一元素,……1、先选取各块中的最大关键字构成一个索引表;2、查找分两个部分:先对索引表进行二分查找或顺序查找,以确定待查记录在哪一块中;3、在已确定的块中用顺序法进行查找。示例:namespace Ind

2020-08-28 15:10:36 428796

原创 (精华)2020年8月28日 数据结构与算法解析(二叉树排序)

1、二叉树排序二叉树排序是构建在二叉排序树(Binary Sort Tree)上的算法,二叉排序树或者是一棵空树,或者是具有下列性质的二叉树。二叉树排序需要先生成一个二叉排序树,再使用中序遍历输出所有数据。1.1 算法描述二叉树排序是构建在二叉排序树(Binary Sort Tree)上的算法,二叉排序树或者是一棵空树,或者是具有下列性质的二叉树:若左子树不空,则左子树上所有结点的值均小于或等于它的根结点的值;若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值;左、右子树也分别为二

2020-08-28 14:34:09 428897

原创 (精华)2020年8月28日 数据结构与算法解析(树查找)

二叉排序树或者是一棵空树,或者是具有下列性质的二叉树:若左子树不空,则左子树上所有结点的值均小于或等于它的根结点的值;若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值;左、右子树也分别为二叉排序树。二叉树查找需要先生成一个二叉排序树,再遍历所有节点逐一比较其值与关键字是否相同,相同则返回;若一直找不到,则返回-1。示例:public class BSTNode { public int Key { get; set; } public int Index

2020-08-28 14:02:52 428674

原创 (精华)2020年8月28日 数据结构与算法解析(斐波那契查找)

斐波那契查找是区间中单峰函数的搜索技术,它在二分查找的基础上根据斐波那契数列进行分割的。在斐波那契数列找一个等于或略大于查找表中元素个数的数F[n],如果原查找表长度不足F[n],则补充重复最后一个元素,直到满足F[n]个元素时为止。完成后进行斐波那契分割,即F[n]个元素分割为前半部分F[n-1]个元素,后半部分F[n-2]个元素,根据值的关系确定往前或往后查找,直到找到时为止。如果一直找不到,则返回-1。示例:public class Program { public static vo

2020-08-28 13:35:09 428701

原创 (精华)2020年8月28日 数据结构与算法解析(插值查找)

插值查找是二分查找的更高效版本,它不会每次按2平分原问题规模,而是应用一个技巧来尽快的接近目标关键字。示例public class Program { public static void Main(string[] args) { int[] array = { 8, 11, 21, 28, 32, 43, 48, 56, 69, 72, 80, 94 }; Console.WriteLine(InterpolationSearch(array, 80, 0

2020-08-28 12:00:37 428714

原创 (精华)2020年8月28日 数据结构与算法解析(二分查找)

二分查找(跟二叉查找树原理类似,但数据存储方式不同),它效率高,但是有一个明确的要求就是必须是有序的线性结构,在C#中常用Array,ArrayList,List等数据结构。二分查找非递归版:static int BinaryFind1(int[] arr, int value){ int upperBound, lowerBound, mid; upperBound = arr.Length - 1; lowerBound = 0; int count = 1;

2020-08-28 11:31:00 428818

原创 (精华)2020年8月28日 数据结构与算法解析(顺序查找)

一、顺序查找:顾名思义,就是从头开始一直找到结束,找到了就返回,否则继续找,找完了没找到就返回-1普通版static int SequenceFind(int[] arr,int value){ for (int i = 0; i < arr.Length-1; i++) { if(arr[i] == value) { return i; } } return -1;}优化版:将常查找的

2020-08-28 11:21:48 429090

原创 (精华)2020年8月28日 数据结构与算法解析(基数排序)

1、基数排序(Radix Sort)基数排序是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位。有时候有些属性是有优先级顺序的,先按低优先级排序,再按高优先级排序。最后的次序就是高优先级高的在前,高优先级相同的低优先级高的在前。1.1 算法描述取得数组中的最大数,并取得位数;arr为原始数组,从最低位开始取每个位组成radix数组;对radix进行计数排序(利用计数排序适用于小范围数的特点);1.2 动图演示1.3 代码实现/// <summary&gt

2020-08-28 10:30:54 428868

空空如也

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人 TA的粉丝

提示
确定要删除当前文章?
取消 删除