C#数据结构学习:什么是数据结构

数据结构介绍:

以下将会介绍常见的数据结构。 如果嫌麻烦,那就可以跳过,以后再慢慢学习,日后再回过头看总结也行

数组(Array):
1、数组存储在连续的内存上
2、数组的元素类型必须相同
3、数组可以直接通过下标访问
4、查找与修改元素的速度非常快
5、必须在声明时指定长度

动态数组(ArrayList):
1、ArrayList的底层其实就是一个数组
2、不必在声明时指定长度,会根据存储的数据动态增加或减少长度
3、插入和删除一个元素时,会移动它之后所有元素的位置,效率低,频繁进行插入删除元素时推荐使用LinkedList
4、ArrayList会把所有元素都当做Object处理,因此可以存储不同类型的元素
5、ArrayList是非类型安全的,而且在插入和删除元素时会进行拆箱和装箱的操作,消耗性能,效率低

泛型List:
1、List是ArrayList的泛型等效类
2、需要在声明时通过泛型指定类型
3、没有拆箱装箱操作,因此在大多数情况下List要比ArrayList效率高且类型安全

双向链表(LinkedList):
1、链表在内存中的空间不是连续的,每块空间称作一个节点,每个节点都存有与它之前和之后相连接的节点的地址,因此向链表中添加和删除元素时只需要更改相关节点存储的地址的指向,效率高
2、查找元素时不能通过下标访问,只能从头开始通过地址按顺序查找,效率低

堆栈(Stack):
先进后出原则,最先插入的元素最后被访问,最后被插入的元素最先被访问

队列(Queue):
先进先出的原则,最先插入的元素最先被访问,最后插入的元素最后被访问

字典(Dictionary):
1、创建字典时需要指定key和value的类型
2、字典中的key的值必须唯一,value的值不唯一
3、可以通过key快速查找对应的value,速度快,但是消耗内存

为何要学习数据结构?

①数据结构相当于程序猿的工具箱,对于常见的问题,都有好的解决方案
②会有一些常见的算法,这些算法是长期的工作中总结出来的,通过算法的训练,直接提高程序的设计水平
③提高程序猿编程能力

数据结构和算法的关系

数据结构难免会和算法挂钩,两者是密切相关的

这样讲未免有点笼统,那让我们看一些例子,从例子里面找到他们的关系

> 例1:把数据结构比做成书架,数据比做成图书,那么如何在书架上摆放图书?

第一种办法是直接一股脑的放上去,不管三七二十一。但是可想而知,如果后续有查询的要求的话,那图书管理员为了找一本书可能会花上一上午的时间,如果书籍数量多的吓人,那可能会直接辞职了哈哈哈。

第二种办法是按拼音顺序摆放,查询要求就按二分查询法;
何为二分查询法?解释一下就是我有本拼音X开头的书,我直接从书架上这堆书随机取中间的一本书,发现是L开头的,那前半就不找了,再在后半随机取中间的一本书和目标做对比,知道找到X开头的书,再从X开头的书中一本一本去找。
优点是有规律可循,但是缺点也很显而易见;
放书的时候,如果我有一个B开头的书,那我为了插进这本书,需要将从后续的所有书籍都要腾出个位,或者多准备几个空书架。
取书的时候,如果我刚好我要找的书开头是X,在书架上X开头的书的数量达到万来计量,这也是个累死人的活。因此这种方法是不可取的。

第三种方法是大部分书城都采用的方法:先按类区分,再按拼音顺序摆放;
这种方法比前面两种方法考虑周全的多,先按类别进行区分,譬如计算机类,机械类,医学类,再从一个个类中按拼音顺序摆放,但是这个办法也是缺点很明显:
放书取书的时候都要斟酌一下书的类别。如果类别过细,那可谓是给自己找麻烦。如果类别过大,办法的效果又不明显。

所以从这个例子可以看出:

解决问题方法的效率,跟数据的组织方式有关

接下来看下面的例2

例2:写程序实现一个函数Log,使得传入一个正整数为N的参数后,能顺序打印出从1到N的全部正整数

我们这里用两个函数Log1、Log2分别来实现它,然后看看有什么区别

在这里补充一下,测试时间的函数可以看这篇文章:
C# 使用Stopwatch测量运行时间

接下来看看代码:

Log1://使用for循环

public void Log1(int n)
        {
            for (int i = 1; i <= n; i++)
            {
                Console.WriteLine(i);
            }
        }

Log2://使用递归

public void log2(int n)
        {
            if (n>=0)
            {
                Console.WriteLine(n);
                log2(n - 1);
            }
        }

分别调用:

Stopwatch watch = new Stopwatch();
Class1 class1 = new Class1();
            watch.Start();
            class1.Log1(100);
            watch.Stop();
            Console.WriteLine("Log1所用时间为{0}ms",      watch.ElapsedMilliseconds);

            watch.Restart();
            class1.log2(100);
            watch.Stop();
            Console.WriteLine("Log2所用时间为{0}ms", watch.ElapsedMilliseconds);

            Console.ReadKey();

看看结果:

在这里插入图片描述

在这里插入图片描述
虽然两者相差十秒左右,但是我们让他各自调用5000次就是不同的概念了,因为这里要分别调用5000次,等的时间太久了,笔者就没有进行试验了

由此可以看出:

递归比循环占的内存空间要大,而解决问题的方法效率,跟空间的利用效率有关

最后看看例3

例3:写程序计算
在这里插入图片描述

这里还是给了两个方法
方法1:直接翻译公式给机器来算

double Function1(int n, double[] a, double x)//直接翻译
        {
            double p = a[0];
            for (int i = 1; i < n; i++)
            {
                p += (a[i] * System.Math.Pow(x, i));
            }
            return p;
        }

方法2:把x提取公因式来计算:
在这里插入图片描述

double Function2(int n, double[] a, double x)//f(x)=a0+x(a1+x(...(an-1+x(an))...))
        {
            double p = a[n -1];
            for (int i = n-1; i > 0; i--)
            {
                p = a[i - 1] + x * p;
            }
            return p;
        }

让我们来看看分别调用5000次的结果:
在这里插入图片描述

很显而易见,调用次数一多,方法2所用的时间是少的夸张

因此:

解决问题的方法效率,跟算法的巧妙程度有关

所以到底什么是数据结构:

数据结构在计算机的组织方式:
逻辑结构,
物理存储结构

数据对象一定和加在其上的一系列操作相关联,完成这些操作所用的方法就是算法。

最后补充逻辑结构和存储结构

逻辑结构类型:
①集合
②线性结构:1对1关系
③树形结构:1对多关系
④图形结构:多对多关系

存储类型:(逻辑结构在计算机内存里是怎么放法)
①顺序存储:利用数组实现
②链式存储:利用指针实现
③索引存储:利用索引项实现
④散列、哈希存储:利用哈希公式等计算并存储数值为地址

描述数据结构有一个很好的方法叫抽象数据结构类型

它指的是用户进行软件系统设计时从问题的数学模型中抽象出来的逻辑数据结构和逻辑数据结构上的运算,而不考虑计算机的具体存储结构和运算的具体实现算法

最后附上一篇讲逻辑结构和存储结构文章:
https://blog.csdn.net/kong_xz/article/details/79409734

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

心满意足的大脸猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值