IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    JavaScript数据结构和算法简述(一)——数组(上篇)

    richieli发表于 2015-05-29 11:57:39
    love 0

    程序=数据结构+算法

    在我对数据结构和算法进行描述之前,请允许我把这句话放在文章开头来显示数据结构和算法的重要性。

    科班出身的同学都明白数据结构和算法的重要性,而对于没有接受过正规的计算机科学教育,唯一熟悉的数据结构就是数组了,但在处理一些复杂的问题时,数组实在是太low了。随着js在服务器端发展的趋势,灵活运用数据结构和算法是必须的。

    用一句话概括让你对数据结构和算法有一个初步的印象:只要是有些规模的程序,就需要用数据结构存储程序输入的数据,再加上一些巧妙的算法输出理想的结果。最终该程序的性能就取决于你使用的数据结构和算法了,时间复杂度上是O(1)还是O(n)由你做主。

    举例说明:我们姑且不考虑空间复杂度,使用数组和BST(二叉查找数)完成查找一组数中最大值的算法,时间复杂度上数组最多做到O(N),而BST查找、插入、删除的复杂度等于树高,也就是O(logN),最坏O(N)。

    前言结束,下面就对javascript数组进行描述。

    数组定义:一个存储元素的线性集合,元素可以通过索引来任意存取,索引通常是数字,用来计算元素之间存储位置的偏移量。

    • 一、javascript数组特性
      • 1.数组在js中是一个特殊的对象,表示偏移量的索引是该对象的属性,但是不管该索引是不是整数,在内部都会被转换为字符串类型。
      • 2.脚本语言里,数组中的元素不必是同一种数据类型,这一点和很多编程语言不同。
      • 3.专家推荐使用[]操作符创建数组,和使用new Array()相比,效率更高。详细原因自行谷歌喽。
      • 4.JS的数组长度可以任意增长,当然就可以超出其创建时指定的长度了,length属性反映的是当前数组中的元素的个数。
      • 5.Js只支持一维数组,但是可以通过在数组里保存数组元素,来创建多维数组。
      • 6.参差不齐的数组(数组每行的元素个数彼此不同)。相比很多编程语言Js的表现良好。
      • 7.利用js原生的方法总是比你自己封装好来实现相同功能的方法性能好。

    • 二、使用数组
    • 1.创建数组

    var nums = [];

    var nums = [1, 2, 3, 4];

    • 或者非主流一点:

    var obj = [1, null, “Tom”, false];

    • 2.数组读写

    var nums = [];

    for(var i=0; i

    nums[i] = i + 1;

    • }
    • 3.字符串转数组(split())

    var str = “hi tencent !”;

    var words = str.split(“ “);

    for(var i=0; i< words.length; i++) {

    print(words[i]);

    • }
    • 4.对数组整体操作(浅复制、深复制、print())
    • 浅复制:新数组是原数组的一个引用,更改任意一个数组元素,都会影响其他引用:

    var nums = [];

    for(var i=0; i

    nums[i] = i + 1;

    }

    var copyNums = nums;

    • 深复制:将原数组的每一个元素都复制到新的数组中:

    function copy(arr1, arr2) {

    for(var i=0; i

    arr2[i] = arr1[i];

    }

    • 直接print数组:

    var nums = [1, 2, 3, 4];

    • print(nums);
    • 该方法默认调用数组的toString方法。输出1,2,3,4.
    • 5.数组字符串表示(join(),toString())

    var words = [“hi”, “tencent”];

    • print(words.join());
    • print(words.toString());
    • 6.已有数组创建新数组(concat(),splice())
    • concat方法合并多个数组:

    var nums1 = [1, 2, 3, 4];

    var nums2 = [1, 2, 3, 4];

    var nums = num1.concat(num2);

    • splice方法截取数组(当然该方法也可以用于增加和插入):

    var nums1 = [1, 2, 3, 4];

    var nums = nums1.splice(1, 2);

    • 三、数组操作
    • 数组相应算法十分简单,查找就是根据索引遍历,找到为止;删除就是找到该索引,将其后面的元素向前移动;插入是将插入位置之后的元素往后移动;js原生的提供了这些方法,我就用原生的方法进行描述。
    • 1.查找(indexOf(), lastIndexOf())
    • var words = [“hi”, “tencent”];

      var pos = words.indexOf(“tencent”);

      if(pos >= 0) {

      print(“tencent at position” + pos);

      } else {

      print(“tencent not found”);

    • }
    • 2.插入(push(), unshift(), splice())
    • push方法在数组末尾添加:
    • var nums = [1, 2, 3, 4];

    • nums.push(5);
    • unshift方法在数组开头添加:
    • var nums = [1, 2, 3, 4];

    • nums.unshift(0);
    • splice方法在数组中间添加:
    • var nums = [1, 2, 5, 6];

      var nums1 = [3, 4];

      nums.splice(2, 0, nums1);

    • print(nums);
    • 3.删除(pop(), shift(), splice())
    • pop方法在数组末尾删除:
    • var nums = [1, 2, 3, 4];

    • nums.pop();
    • shift方法在数组开头删除:
    • var nums = [1, 2, 3, 4];

    • nums.shift();
    • splice方法在数组中间删除:
    • var nums = [1, 2, 5, 6];

      nums.splice(2, 1);

    • print(nums);

    未完待续(数组遍历、排序、二维数组、对象数组)



沪ICP备19023445号-2号
友情链接