线性表(linear list)是最常用且最简单的一种数据结构。一个线性表是n个数据元素的有限序列。在稍复杂的线性表中,一个数据元素可以由若干个数据项(item)组成。

其中:

  • 数据元素的个数n定义为表的长度 = "list".length() ("list".length() = 0(表里没有一个元素)时称为空表)
  • 将非空的线性表(n>=0)记作:(a[0],a[1],a[2],…,a[n-1])
  • 数据元素a[i](0≤i≤n-1)只是个抽象符号,其具体含义在不同情况下可以不同

一个数据元素可以由若干个数据项组成。数据元素称为记录,含有大量记录的线性表又称为文件。这种结构具有下列特点:存在一个唯一的没有前驱的(头)数据元素;存在一个唯一的没有后继的(尾)数据元素;此外,每一个数据元素均有一个直接前驱和一个直接后继数据元素。

线性表的存储结构

在这种情况下,常把数据元素称为记录(record),含有大量记录的线性表又称文件(file)。

1.假设利用两个线性表LA和LB分别表示两个集合A和B,现要求一个新的集合A=AUB。这就要求对线性表作如下操作:扩大线性表LA,将存于线性表LB中而不存在于

线性表LA中的数据元素插入到线性表LA中去。只要从线性表LB中依次取得每个数据元素,并依值在线性表LA中进行查找,若不存在,则插入之。

下面是算法描述(这里用js的数组来表示线性表):

 // 将所有在数组b中但不在数组a的数据元素插入到a中

   var a = [1, 2, 3, 4, 5];
var b = [1, 3, 5, 7, 9]; function union(a, b) {
var elem, equal; for (var i = 0, bLen = b.length; i < bLen; i++) {
elem = b[i];
equal = false; for (var j = 0, aLen = a.length; j < aLen; j++) {
if (elem === a[j]) {
equal = true;
break;
}
} if (!equal) a.push(elem);
}
} union(a, b);
console.log(a);
// [1, 2, 3, 4, 5, 7, 9] // 时间复杂度:O(aLen * bLen)

2.已知线性表LA和LB中的数据元素按值非递减有序排列,现要求将LA和LB归并为一个新的线性表LC,且LC中的数据元素仍按值非递减有序排列:

我们可设两个变量分别保存LA和LB的索引,并对对应的元素进行比较:

  1 // 已知数组a和数组b中的数据元素按值非递减排列
2 // 归并a和b得到新的数组c,c的数据元素也按值非递减排列
3 var a = [3, 5, 8, 11];
4 var b = [2, 6, 8, 9, 11, 15, 20];
5
6 function mergeList(a, b) {
7 var c = [], aElem, bElem;
8 var i = 0, j = 0, k = 0;
9 var aLen = a.length;
10 var bLen = b.length;
11
12 while (i < aLen && j < bLen) {
13 aElem = a[i];
14 bElem = b[j];
15
16 if (aElem < bElem) {
17 c[k++] = aElem;
18 i++;
19 } else {
20 c[k++] = bElem;
21 j++;
22 }
23 }
24
25 while (i < aLen) {
26 c[k++] = a[i++];
27 }
28
29 while (j < bLen) {
30 c[k++] = b[j++];
31 }
32
33 return c;
34 }
35
36 var c = mergeList(a, b);
37 console.log(c);
38 // [2, 3, 5, 6, 8, 8, 9, 11, 11, 15, 20]
39
40 // 时间复杂度: O(aLen + bLen)

线性表的顺序表示和实现

线性表的顺序表示指的是用一组地址连续的存储单元一次存储线性表的数据元素

假设线性表的每个元素需暂用l个存储单元,并以所占的第一个单元的存储地址为左数据元素的存储位置。则线性表中第i1个数据元素的存储位置LOC(a(i+1))和第i个元素的存储位置LOC(a(i))之间满足下列关系:

LOC(a(i + 1)) = LOC(a(i)) + l;

线性表的这种表示称做线性表的顺序存储结构或顺序映射(sequential mapping)。通常,,称这种存储结构的线性表为顺序表。它的特点是,为表中相邻的元素a(i)和a(i+1)赋以相邻的存储位置LOC(a(i))

和LOC(a(i+1))。换句话说,以元素在计算机内“物理位置相邻”来表示线性表中数据元素之间的逻辑关系。每一个数据元素的存储位置都和线性表的起始位置相差1一个和数据元素在线性表中的位序成正比的常数。由此,只要确定了存储线性表的起始位置,线性表中任意数据元素都可随机存取,所以线性表的顺序存储结构是一种随机存取的存储结构。

由于高级程序设计语言中的数组类型也有随机存取的特性,因此,通常都用数组来描述数据结构中的顺序存储结构。

为了更清楚线性表的顺序表示,我们实现js的伪数组进行模拟,插入和删除元素:

 // 使用伪数组模拟线性表插入操作的前后数据元素在存储空间中的位置变化
var a = {0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5};
a.length = 6; function insert(a, i, elem) {
if (!elem) return; var len = a.length;
if (i >= len) {
while (len < i) {
a[len++] = undefined;
a.length++;
}
a[i] = elem;
} else {
while (len > i) {
a[len--] = a[len];
}
a[i] = elem;
}
a.length++;
} insert(a, 3, 8);
insert(a, 10, 10);
console.log(a); // 使用伪数组模拟线性表删除操作的前后数据元素在存储空间中的位置变化 function del(a, i) {
var temp = a[i];
var j = i + 1;
var len = a.length; while (j < len) {
a[j - 1] = a[j++];
}
a.length--;
delete a[len - 1]; return temp;
} del(a, 3);
console.log(a);
del(a, 10);
console.log(a); // 时间复杂度: O(a.length)

线性表的顺序存储结构的特点是逻辑关系上相邻的两个元素在物理位置上也相邻,因此可以随机存取表中任一元素,它的存储位置可用一个简单,直观的公式来表示。然后,另一方面来看,这个特点也造成这种存储结构的弱点,在做插入或删除操作时,需移动大量元素。下一节会讨论这个问题的解决方法--链式存储结构。

javascript实现数据结构:线性表--简单示例及线性表的顺序表示和实现的更多相关文章

  1. Sharding-JDBC分库分表简单示例

    1. 简介 Sharding是一个简单的分库分表中间件,它不需要依赖于其他的服务,即可快速应用在实际项目的分库分表策略中. 2. 初始化数据库(db0.db1.db2) 1 #创建数据库db0 2 C ...

  2. javascript里label语句的简单示例

    在javascript中,我们可能很少会去用到 Label 语句,但是熟练的应用 Label 语句,尤其是在嵌套循环中熟练应用 break, continue 与 Label 可以精确的返回到你想要的 ...

  3. ABAP分享三 批量上传数据到内表简单示例

    tYPE-POOLS: truxs. DATA: BEGIN OF build, name(10) TYPE c,   age(3)   TYPE c,   sex(2)   TYPE c,   sp ...

  4. javascript实现数据结构与算法系列

    1.线性表(Linear list) 线性表--简单示例及线性表的顺序表示和实现 线性表--线性链表(链式存储结构) 线性表的静态单链表存储结构 循环链表与双向链表 功能完整的线性链表 线性链表的例子 ...

  5. javascript实现数据结构与算法系列:栈 -- 顺序存储表示和链式表示及示例

    栈(Stack)是限定仅在表尾进行插入或删除操作的线性表.表尾为栈顶(top),表头为栈底(bottom),不含元素的空表为空栈. 栈又称为后进先出(last in first out)的线性表. 堆 ...

  6. javascript实现数据结构:广义表

    原文:javascript实现数据结构:广义表  广义表是线性表的推广.广泛用于人工智能的表处理语言Lisp,把广义表作为基本的数据结构. 广义表一般记作: LS = (a1, a2, ..., an ...

  7. 【线性表基础】基于线性表的简单算法【Java版】

    本文描述了基于线性表的简单算法及其代码[Java实现] 1-1 删除单链表中所有重复元素 // Example 1-1 删除单链表中所有重复元素 private static void removeR ...

  8. javascript实现数据结构与算法系列:队列 -- 链队列和循环队列实现及示例

    1 队列的基本概念 队列(Queue):也是运算受限的线性表.是一种先进先出(First In First Out ,简称FIFO)的线性表.只允许在表的一端进行插入,而在另一端进行删除. 队首(fr ...

  9. SDUT 3379 数据结构实验之查找七:线性之哈希表

    数据结构实验之查找七:线性之哈希表 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 根据给定 ...

随机推荐

  1. App.config的学习笔记

    昨天基本弄清config的使用之后,再看WP的API,晕了.结果WP不支持system.configuration命名空间,这意味着想在WP上用App.config不大可能了. WP具体支持API请查 ...

  2. try-catch-finally中return语句的执行

    catch里return后还会执行finally吗??在java里,是的.但是值得注意的是,在存在try-catch-finally的方法中,return可能出现的位置有4个,在try中,在catch ...

  3. hdu 1237 简单计算器

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1237 简单计算器 Description 读入一个只包含 +, -, *, / 的非负整数计算表达式, ...

  4. poj 2631 Roads in the North

    题目连接 http://poj.org/problem?id=2631 Roads in the North Description Building and maintaining roads am ...

  5. .net 面试问题 汇总

    用.net做B/S结构的系统,您是用几层结构来开发,每一层之间的关系以及为什么要这样分层? 答: 从下至上分别为:数据访问层.业务逻辑层(又或成为领域层).表示层 数据访问层:有时候也称为是持久层,其 ...

  6. JVM学习总结五(番外)——JConsole

    之前本来打算结合自己写的小程序来介绍JConsole和VirtualVM的使用的,但是发现很难通过一个程序把所有的场景都体现出来,所以还是决定用书中的典型小例子来讲更加清晰. 一.JConsole的基 ...

  7. 浅析Objective-C字面量

    编写Objective-C程序时,总会用到某几个类,它们属于Foundation框架.虽然从技术上来说,不用Foundation框架也能写出Objective-C代码,但实际上却经常要用到此框架.这几 ...

  8. UIView Programming Guide学习笔记

    |View |Creating and Configuring View Objects |Creating and Managing a View Hierarchy |Adjusting the ...

  9. Android HttpClient GET或者POST请求基本使用方法(转)

    在Android开发中我们经常会用到网络连接功能与服务器进行数据的交互,为此Android的SDK提供了Apache的HttpClient来方便我们使用各种Http服务.这里只介绍如何使用HttpCl ...

  10. (转)android Fragments详解三:实现Fragment的界面

    为fragment添加用户界面 fragment一般作为activity的用户界面的一部分,把它自己的layout嵌入到activity的layout中.    一个 要为fragment提供layo ...