顺序表算法设计笔记

1、已知长度为 n 的线性表 A 采用顺序存储结构。设计一个时间复杂度为O(n)、空间复杂度为O(1)的算法,该算法删除线性表中所有值为 x 的元素数据元素。

以下两种方法都不满足要求:

  • 如果删除一个值为 x 的元素都进行移动, 其时间复杂度为O(n^2),时间复杂度为O(1).
  • 如果借助一个新的顺序表, 存放将A中所有不为x的元素,其时间复杂度O(n), 空间复杂度为O(n)。

解法一:设删除 A 中所有值等于 x 元素后的顺序表为A1, 显然A1包含在 A 中, 为此A1重用 A 的空间。

思路:扫描顺序表 A,重建 A 只包含不等于 x 的元素, 代码如下:

 1 #include <stdio.h>
 2
 3 // 线性表
 4 typedef struct {
 5     int arr[10];
 6     int length;
 7 } seq_list;
 8
 9 void delnodel(seq_list* list, int x)
10 {
11     int k = 0;
12     int i;
13     for (i=0; i<list->length; i++){
14         if (list->arr[i] != x){
15             list->arr[k] = list->arr[i];
16             k++;
17         }
18     }
19 }

解法二: 用 k 记录顺序表 A 中遍历过元素中等于 x 的元素个数。

思路:将不为 x 的元素前移 k 个位置, 最后修改 A 的长度, 代码如下:

 1 #include <stdio.h>
 2
 3 // 线性表
 4 typedef struct {
 5     int arr[10];
 6     int length;
 7 } seq_list;
 8
 9 void delnode2(seq_list* list, int x)
10 {
11     // 记录以遍历的 x 的个数
12     int k = 0;
13     int i = 0;
14     while (i < list->length){
15         if (list->arr[i] == x){
16             k++;
17         } else {
18             list->arr[i-k] = list->arr[i];  // 移动 k 个位置
19         }
20         i++;
21     }
22     list->length -= k;      // 更新长度
23 }

上面的两个解法本质上是干的事情是一样的, 将元素移动 n 个位置覆盖掉不等于x的元素,两个算法中 n 是相等的,一个通过记录不等于x的元素个数知道n;一个通过记录等于x的元素个数知道n;等于x的 + 不等于x的 = 长度;

时间: 2024-10-20 13:28:31

顺序表算法设计笔记的相关文章

实验三 跳表算法设计与实现

一.实验名称:跳表算法设计与实现 二.实验目的: 掌握跳表的数据结构. 掌握跳表插入算法的思想和实现. 三.实验内容 完善下列程序,并回答问题. 1 #include <iostream.h> 2 #include<stdlib.h> 3 4 enum ResultCode{Underflow, Overflow, Success, Duplicate, RangeError, NotPresent}; 5 template <class T> 6 struct SNo

顺序表的设计与实现List(Arraylist)

1 //采用线性表实现一个list集合 2 public class SeqList<T> extends Object { 3 private Object[] elements; //数组 4 private int n; //长度 5 6 /** 7 * 构造方法,根据传参创建空表 8 * @param length 9 */ 10 public SeqList(int length) { 11 this.elements = new Object[length]; 12 this.n

顺序表算法题

在长度为n(n<1000)的顺序表中可能存在着一些值相同的"多余"数据元素(类型为整型),编写一个程序将"多余"的数据元素从顺序表中删除,使该表由一个"非纯表"(值相同的元素在表中可能有多个)变成一个"纯表"(值相同的元素在表中只能有一个). Input 第一行输入表的长度n: 第二行依次输入顺序表初始存放的n个元素值. Output 第一行输出完成多余元素删除以后顺序表的元素个数: 第二行依次输出完成删除后的顺序表元素

数据结构实践项目——顺序表

[项目1 - 顺序表的基本运算] 领会"0207将算法变程序"部分建议的方法,将顺序表部分的算法变成程序. 实现顺序表基本运算有算法(对应视频0204创建线性表的实现和0205顺序表基本运算的实现),依据"最小化"的原则进行测试.所谓最小化原则,指的是利用尽可能少的基本运算,组成一个程序,并设计main函数完成测试. 作为第一个这种类型的实践(后续每一部分均有这种实践,这是我们学习的基础,也是实践成果积累的基础),结合相关的算法,给出建议的过程: (1)目的是要测试

数据结构顺序表Java实现

Java实现顺序表算法:1:首先我们需要定义我们的接口,关于顺序表的一些基本的操作:顺序表中的操作都有增删改查. //List接口 public interface IList { //返回线性表的大小,即数据元素的个数. public int getSize(); //如果线性表为空返回 true,否则返回 false. public boolean isEmpty(); //判断线性表是否包含数据元素 e public boolean contains(Object e); //返回数据元素

设计一个算法将一个顺序表逆置

#include<iostream> #include<malloc.h> using namespace std; typedef struct { int length;//保存长度 int data[40];//数组 } SqList; /*算法1:设计一个高效的算法,将顺序表中的所有元素逆置.要求算法空间股咋度为o(1)*/ //初始化顺序表 void initReverse(SqList &s,int *a,int l){ s.length=0; //插入元素 f

算法系列笔记5(扩展数据结构-动态顺序统计和区间树)

在编程中,我们往往使用已有的数据结构无法解决问题,这是不必要急着创建新的数据结构,而是在已有数据结构的基础上添加新的字段.本节在上一次笔记红黑树这一基础数据结构上进行扩展,得出两个重要的应用-动态顺序统计和区间树. 动态顺序统计 在算法系列笔记2中我们在线性时间内完成了静态表的顺序统计,而这里我们在红黑树上进行扩展,在O(lgn)时间内完成该操作,主要包括返回第i 排名的元素os_select(i)和给定一个元素x,返回其排名(os_rank(x)). 思想:添加新项:在红黑树的结点上记录下该结

稀疏矩阵的三元组顺序表存储及矩阵相乘算法小结

稀疏矩阵的三元组顺序表存储及矩阵相乘算法小结 巧若拙(欢迎转载,但请注明出处:http://blog.csdn.net/qiaoruozhuo) 一:稀疏矩阵的三元组顺序表数据结构 typedef int ElemType; typedef struct { intx, y;  //该非零元素的行下标和列下标 ElemTypee; //该非零元素的值 } Triple; typedef struct { Tripledata[MAXSIZE]; //非零元素三元组顺序表 intmu, nu, t

java数据结构与算法之顺序表与链表深入分析

转载请注明出处(万分感谢!): http://blog.csdn.net/javazejian/article/details/52953190 出自[zejian的博客] 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 ??数据结构与算法这门学科虽然在大学期间就已学习过了,但是到现在确实也忘了不少,因此最近又重新看了本书-<数据结构与算法分析>加上之前看的<java数据结构>也算是对数据结构的进一步深入学习了,于是也就打算