zoukankan      html  css  js  c++  java
  • 数据结构与算法之数组

        数组的基本概念:数组是最简单最经常使用的数据结构,可是也有一些注意事项:

    (1)数组的分配方式以及存储位置。

    (2)初始化;

    (3)不同语言中的数组高级定义;

    (4)多维数组;


    C/C++中数组分配方式:

    (1)int a[10];

    适用于数组长度已知或者对数组长度不敏感的情况。比方定义一个字符串。

    (2)int *a = (int *)malloc(sizeof(int)*n);

    用在C中,适用于动态申请数组的长度。记得最后要free,防止内存泄露。

    (3)int[] a = new int[n];

    用在C++中。

    最后要delete。


    进程的虚拟地址空间:



    进程在执行的过程中会将地址划分为很多段,重要的有两个:执行时堆和用户栈。动态申请的数组(malloc和new)会在执行时堆中,常量数组(int a[10])会放在用户栈里面。

    放在执行时堆中的数组是永久性的。不主动释放就会永久存在,所以才会导致内存泄露。而在用户栈空间是暂时,会随着函数的调用和返回进行回收。所以我们不能返回局部变量的地址,尤其是返回一个常量数组的首地址,由于这个地址会在用完之后被回收。所以说一个函数假设在函数内部被改动。想要在函数外部继续用的话,就要使用动态分配的数组。


    C/C++中数组的初始化

    编程中非常多bug都是由直接引用未初始化的变量导致的。一般数组的初始话例如以下:

    (1)全局数组自己主动初始化;

    (2)malloc方式不初始化,能够用memset(可初始化为0或者-1),fill进行初始化;

    (3)new方式须要依据编译器推断;


         基础的数组直接操作内存。效率高。可是缺乏丰富的api。所以高级语言往往会有对应的高级实现。C/C++中使用STL中的vector.

         多维数组是一维数组的扩展,二维数组能够用来描写叙述矩阵或者图。例如以下:

        int a1[10][10];//要求数组的两维都确定;
        int **a2;//两维都不确定;
        int* a3[10];//每一维单独分配,长度能够不一致;
        vector<int> a4[10];//仅仅能在C++中使用;
        vector<vector<int>> a5;//仅仅能在C++中使用。

    多维数组在訪问过程中要注意cache缺失问题,数组能够有按行操作方式和按列操作方式。按行操作方式要好过按列操作方式。由于二维数组载入到cache的过程是按行来的,所以当在訪问某一行的时候,这一行的元素都已经在cache中了。可是按列方式訪问就不同,通常仅仅有一个元素在cache中。其它元素都会缺失的,所以按列訪问会造成严重的cache缺失问题。会严重影响性能。


    数组在排序中的作用

        对于经常使用的七大排序,在我前面几篇博客中都有讲到,包含代码实现。

    当中数组在排序中有非常大的作用,以下做一个简单的排序概述:

    复杂度为O(n^2):

    (1)插入排序-复杂度为O(n^2)中最快的;

    (2)选择排序、冒泡排序比較慢。通常会出如今面试题中。


    复杂度为O(N*logN):

    (1)高速排序:基于比較的排序中速度最快的。

    (2)归并排序:实际中较少使用,经常在面试中;

    (3)堆排序:实际中较少使用,可是堆非经常常使用;


    复杂度为O(n),仅仅能对正整数进行排序:

    (1)基数排序-复杂度O(n+r),r为基数;

    (2)计数排序-复杂度O(n+k),k为元素范围;


    可是在实际开发中,C/C++中自带了排序函数:

    (1)在C语言中有qsort函数,须要自己定义cmp比較函数,函数形式例如以下:

    int cmp(const void *a,const void *b);

    (2)C++中。STL中自带排序函数sort。调用方法例如以下:

    sort(a.begin(),a.end(),[greater<int>() | less<int>()]);



  • 相关阅读:
    UVA 10600 ACM Contest and Blackout(次小生成树)
    UVA 10369
    UVA Live 6437 Power Plant 最小生成树
    UVA 1151 Buy or Build MST(最小生成树)
    UVA 1395 Slim Span 最小生成树
    POJ 1679 The Unique MST 次小生成树
    POJ 1789 Truck History 最小生成树
    POJ 1258 Agri-Net 最小生成树
    ubuntu 用法
    ubuntu 搭建ftp服务器,可以通过浏览器访问,filezilla上传文件等功能
  • 原文地址:https://www.cnblogs.com/yfceshi/p/7040399.html
Copyright © 2011-2022 走看看