zoukankan      html  css  js  c++  java
  • 线性数据结构

    什么是数据结构?

      数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。

    举3个例子:

    • 食堂排队打饭,每个人与前后人之间的关系

    • 计算机的目录结构

    • 手机导航软件如何存储位置

    一、线性数据结构

      线性数据结构的特点:

    • 存在唯一的一个被称作“第一个”的数据元素
    • 存在唯一的一个被称作“最后一个”的数据元素
    • 除第一个以外,集合中的每个数据元素均只有一个前驱
    • 除最后一个以外,集合中的每个数据元素均只有一个后继

      【思考 一元多项式f(x)=a0+a1x+···an-1xn-1+anxn在计算机中如何表示?

            计算机如何运算5-4*3+2

      1.线性表的存储结构

        线性表就像火车,按照储存结构分为:顺序表和链表

    ①顺序表:用数组存储,插入和删除数据元素的时间复杂度都为O(n)

    单链表

      包括两个域信息,数据域和指针域,可以用指针来实现也可以用数组来模拟。

      用数组模拟链表需要注意:(1)元素数组Value[]  (2)后继数组Next[]  (3)头指针Head

      查询元素时间复杂度为O(n),插入和删除数据元素的时间复杂度都为O(1)

     1 //用单链表实现线性表:获得存储位置、插入新元素、删除元素 
     2 #include<iostream>
     3 using namespace std;
     4 int n, Value[2001], Next[2001], Head=0;
     5 int GetPos(int pos)//求链表第i个元素的存储位置
     6 {
     7     int hd=Head;
     8     for(int i=1; i<=pos; i++)hd=Next[hd];
     9     return hd;
    10 } 
    11  
    12 void InsertValue(int pos, int val)//在第pos个元素前插入新元素val 
    13 {
    14     int p=GetPos(pos-1);
    15     Value[++n]=val;
    16     Next[n]=Next[p];
    17     Next[p]=n;
    18 }
    19 
    20 void DeleteValue(int pos)//删除第pos个元素 
    21 {
    22     int p=GetPos(pos-1);
    23     Next[p]=Next[Next[p]];
    24 }
    25 
    26 int main()
    27 {
    28     int m;
    29     cin>>n;
    30     for(int i=1; i<=n; i++)
    31     {
    32         cin>>Value[i];
    33         Next[i-1]=i;
    34     }
    35     cin>>m;
    36     for(int i=1; i<=m; i++)
    37     {
    38         int type, pos, val;
    39         cin>>type>>pos;
    40         if(type==1)cout<<Value[GetPos(pos)]<<endl;
    41         if(type==2){cin>>val; InsertValue(pos,val);}
    42         if(type==3)DeleteValue(pos); 
    43     }
    44 } 
    View Code

    ③循环链表

    ④双向链表

    参考代码:http://www.cnblogs.com/ivanovcraft/p/9037475.html

     

    2.队列

      由三个部分构成:(1)顺序表q[m](2)队首指针front(3)队尾指针rear

      队列的基本操作(手写):

      • 队列初始化:front=rear=0            
      • 判断队列是否为空  
      • 判断队列是否已满
      • 进队(插入元素X)
      • 出队
      • 队列中元素个数:rear-front

      循环队列的基本操作:

      • “队列的初始化”与“判断队列是否为空”与队列是一样的
      • 判断队列是否已满:如果(rear+1)%m==front即rear下一位置是front,则队列已满。这种情况下,循环队列q[m]最多只能存储m-1个元素
      • 进队(插入元素x):如果队列未满,则执行q[rear]=x;rear=(rear+1)%m.
      • 出队:如果队列不为空,则返回队首元素q[front]同时front=(front+1)%m
      • 队列中元素的个数:(rear-front+m)%m

      队列的STL操作:

      • queue<int> q;//定义一个存放整形数据的队列
      • q.empty();//bool判断队列是否为空
      • q.push(x);// x进队
      • q.pop();//出队
      • q.size();//队列大小
      • q.front();//返回队首元素

      3.栈

      【思考】计算机如何运算5-4*3+2?

          中缀算术表达式》》后缀算术表达式

      栈的基本操作:

      • 初始化:top=0;stack[m]只能存储m-1个元素???
      • 进栈:如果栈不满,则stack[++top]=item  (s.push(item))
      • 出栈:如果栈不为空,则item=stack[top--];即执行出栈操作时要保证栈中有元素(s.pop())

      4.线性表的处理技巧--哈希表

      处理数据集合(1,75,324,43,1353,90,46)(18,75,60,43,54,90,46)  

      哈希表:散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。

      思考:给出n个不同的正整数a[1]~a[n],它们的值在1~1000000之间。再给定一个整数x,编程计算这样的数(a[i],a[j]),1<=i<j<=n并且a[i]+a[j]=x.样例数据:

      【输入】

      9
      5 12 7 10 9 1 2 3 11
      13

      【输出】3

      

    //hash<rtx>
    #include<cstdio>
    #include<iostream>
    using namespace std;
    int a[10000010],n,x,ans;
    int main()
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            int b;
            scanf("%d",&b);
            a[b]++;
        }
        scanf("%d",&x);
        for(int i=1;i<=x/2;i++)
        {
            if(x-i!=i)
            {
                if(a[x-i]&&a[i])
                {
                    ans+=a[x-i]*a[i];
                }
            }
            else ans+=a[i]*(a[i]-1)/2;
        }
        printf("%d",ans);
    }
    View Code

     

  • 相关阅读:
    js 防止页面后退的方法
    asp.net 设置网页过期
    C#子类调用基类构造备忘
    asp.net 自定义控件 嵌入资源文件 备忘
    CSS实现高度和宽度自适应
    C# 更新SQL Server数据库备注信息从另一数据库
    asp.net mvc4 学习笔记一(基本原理)
    CommittableTransaction和TransactionScope
    Delphi7 错误: Access violation at address ****** in module 'ntdll.dll'. Read of address ******.
    Delphi XE10 IdFtp 错误:No FTP list parsers have been registered
  • 原文地址:https://www.cnblogs.com/tflsnoi/p/10145450.html
Copyright © 2011-2022 走看看