线性表(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. Servlet之HttpServletResponse和HttpServletRequest

    HttpServletResponse 1.告诉服务器应用使用UTF-8解析文本的两种方式,告诉客户端要使用什么编码 response.setHeader("content-type&quo ...

  2. 利用HttpWebRequest访问WebApi

    WebApi现在越来越流行,下面给出利用HttpWebRequest访问WebApi的工具方法: 1.利用基准URL和参数字典生成完整URL /// <summary> /// 生成URL ...

  3. VS活动解决方案平台

    测试环境:win7 x64 测试程序:WCF查询数据库后将数据集返回到Winform程序加载并显示 测试结果: 1.从感觉来说Exe在 x86目标平台生成,启动速度快. 2.内存消耗:x86的程序在超 ...

  4. 委托、匿名函数与Lambda表达式初步

    (以下内容主要来自<C#本质论第三版>第十二章委托和Lambda表达式) 一.委托续 上上周五看了看委托,初步明白了其是个什么,如何定义并调用.上周五准备看Lambda表达式,结果发现C# ...

  5. ARM-Linux S5PV210 UART驱动(3)----串口核心层、关键结构体、接口关系

    尽管一个特定的UART设备驱动完全可以按照tty驱动的设计方法来设计,即定义tty_driver并实现tty_operations其中的成员函数,但是Linux已经在文件serial_core.c中实 ...

  6. angularjs2 学习笔记(二) 组件

    angular2 组件 首先了解angular2 组件的含义 angular2的应用就是一系列组件的集合 我们需要创建可复用的组件供多个组件重复使用 组件是嵌套的,实际应用中组件是相互嵌套使用的 组件 ...

  7. 【Cocoa】 Initializing View Instances Created in Interface Builder

    Initializing View Instances Created in Interface Builder View instances that are created in Interfac ...

  8. 刀哥多线程全局队列gcd-09-global_queue

    全局队列 是系统为了方便程序员开发提供的,其工作表现与并发队列一致 全局队列 & 并发队列的区别 全局队列 没有名称 无论 MRC & ARC 都不需要考虑释放 日常开发中,建议使用& ...

  9. 利用JQ实现的,高仿 彩虹岛官网导航栏(学习HTML过程中的小记录)

    利用JQ实现的,高仿 彩虹岛官网导航栏(学习HTML过程中的小记录)   作者:王可利(Star·星星) 总结: 今天学习的jQ类库的使用,代码重复的比较多需要完善.严格区分大小写,在 $(" ...

  10. Linux查看文件以及文件夹的大小

    df可以查看一级文件夹大小.使用比例.档案系统及其挂入点,但对文件却无能为力.du可以查看文件及文件夹的大小. df命令可以显示目前所有文件系统的可用空间及使用情形,请看下列这个例子: df命令可以查 ...