抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

二分查找算法

只能对有序排列数据进行高效查找。

方法

定义下标:头l,尾r,中位数mid。

集合

集合(set)作为存储数据容器时:

  • 它不允许存储相同元素,只能保留一份。
  • 能快速帮助我们进行去重操作,过滤掉重复元素。

典型应用

词汇量统计

统计一篇英文文章的总单词数,使用集合进行去重,判断英文文章难度。

队列(Queue)

数组实现队列

队列相关操作

void Enqueue(T t);//入队

T Dequeue();//出队

T Peek();//查看队首元素

int Count { get; }//查看元素个数

bool IsEmpty { get; }//查看队列是否为空

js和C#相比。

最大不同,在于js是脚本语言,C#是编译性质的语言。

作用域方面

js的作用域只有全局作用域和方法作用域,但是可以通过let关键字将作用域限制在块中
C#是存在块作用域的,在块中定义的变量,出了这个块就不能使用。

关于拆装箱

  • 装箱:值类型数据转换为引用类型装箱时,生成的是全新的引用对象,这会有时间损耗,因此装箱操作效率不高。
  • 拆箱:引用类型数据转换为值类型数据。
  • 利用装箱拆箱功能,可通过允许值类型的任何值与Object 类型的值相互转换,将值类型与引用类型链接起来。
  • 值类型只会在中分配;
  • 引用类型分配内存与托管;
  • 使用泛型可以避免拆装箱操作。

代码演示:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
namespace AlgorithmTest07_拆装箱
{
class Program
{
static void Main(string[] args)
{
int n = 100000000;
Stopwatch t1 = new Stopwatch();//计时器
Stopwatch t2 = new Stopwatch();//计时器
Console.WriteLine("测试值类型对象int");
t1.Start();//开始计时
List<int> L = new List<int>();
for (int i = 0; i < n; i++)
{
L.Add(i);//不发生装箱
int x = L[i];//不发生拆箱
}
t1.Stop();//停止计时
Console.WriteLine(t1.ElapsedMilliseconds + "ms");
t2.Start();//开始计时
ArrayList aL = new ArrayList();
for (int i = 0; i < n; i++)
{
aL.Add(i);//发生装箱[值类型(int)转引用类型(object),ArrayList是object引用类型]
int x = (int)aL[i];//发生拆箱引用类型强转值类型
}
t2.Stop();
Console.WriteLine(t2.ElapsedMilliseconds + "ms");
Console.ReadKey();
}
}
}

栈(Stack)

栈中元素是从上到下加入的,即“后进先出”

栈的应用

十进制转二进制

枚举算法

image-20221025135058941

打印结果:

image-20221025135114001

递推算法

有一只大兔子,一个月生一只小兔子,过一个月小兔子变大兔子。以此求第几个月,有几个大兔子。

namespace AlgorithmTest
{
class Program
{
static void Main(string[] args)
{
//费波拉契数列,一个数等于前两个数之和。
//根据输入数,展示到这个数之前的所有数。
Console.WriteLine("请输入一个0~21之间的数");
int i = int.Parse(Console.ReadLine());
int[] array = new int[20];//定义有20个空的数组
array[0] = 1;
array[1] = 1;
if (i == 1)
{
Console.WriteLine(array[0]);
}
else if (i == 2)
{
Console.WriteLine(array[0]);
Console.WriteLine(array[1]);
}
else if (i >= 3 && i < 21)
{
Console.WriteLine(array[0]);
Console.WriteLine(array[1]);
for (int j = 3; j <= i; j++)
{
array[j - 1] = array[j - 2] + array[j - 3];
Console.WriteLine(array[j - 1]);
}
}
else
{
Console.WriteLine("数字超过范围");
}
Console.ReadKey();
}
}
}

打印结果:

最近打算恶补数据结构,在学校的时候对数据结构与算法一直是一知半解,懵懵懂懂的样子。特开此贴记录一下过程,希望能有所收获。打算看过c#基本的数据结构之后,各种类型算法题多刷刷。

算法与数据结构的关系

  • 数据结构可以认为是数据在程序中的存储结构,和基本数据操作
  • 算法可以认为是用来解决问题的方法,算法基于数据结构
  • 数据结构是问题的核心,是算法的基础

算法(Algorithm)的评价标准

C#中? 、?? 、?. 、??= 的用法和说明(转载)

一、可空类型修饰符< ? >

引用类型能用空引用来表示一个表示一个不存在的值,但是值类型不能。例如:

string str = null;
int i = null;//编译报错