【转载】顺序表中删除为x的所有元素,时间空间复杂度有要求

解法一:

首先确定顺序表L中的第一个值为x的元素位置i,然后依次检查L.data[i+1]~L.data[L.length-1]中每个元素L.data[j](i+1<=j<L.length),若L.data[j]!=x,则将L.data[j]存入L.data[i]中,并令i增1。最后顺序表长度为i。算法如下:

void delall(Sqlist *l,int x)
{
	int i=0,j;
	while(i<l->length && l->data[i]!=x)
		i++;
	for(j=i+1;j<l->length;j++)
		if(l->data[j]!=x)
		{
			l->data[i++]=l->data[j];
		}
		l->length=i;
}

本算法只扫描一次顺序表,即将值为x的元素前移一次,其时间复杂度为O(n)

解法二:

从头开始扫描顺序表L,用k记录下元素值等于x的元素个数,对于不等于x的元素,前移k个位置,这种算法复杂度为O(n),其中n为顺序表的长度,算法如下:

void delall(Sqlist *l,int x)
{
	int i=0,j=0;
	while(i<l->length)
	{
		if(l->data[i]==x)
			j++;//j记录被删记录的个数
		else
			l->data[i-j]=l->data[i];//前移j个位置
		i++;
	}
	l->length-=j;
}
时间: 2024-11-10 08:34:42

【转载】顺序表中删除为x的所有元素,时间空间复杂度有要求的相关文章

C++中如何在顺序容器中删除符合特定条件的元素

以前很少做删除操作,vector一直当成数组用,而实际追求效率时又经常舍弃vector选用C风格数组.看<C++ Primer>到顺序容器删除这节时试着实现课后习题结果一动手我就出错了. 习题是将数组int ia[]拷贝到std::vector<int>中,并删除偶数元素. 先给出我的错误代码 int ia[] = { 0, 1, 1, 2, 3, 5, 8, 13, 21, 55, 89 }; vector<int> v(begin(ia), end(ia)); fo

顺序表之删除表中元素最小值

1 #include<stdio.h> 2 #define MAX 10//表的长度为10 3 typedef int ElementType; 4 int length=0; 5 int value,pos;//记录值和位置 6 typedef struct { 7 ElementType i; 8 int length; 9 ElementType data[MAX]; 10 }Sorder; 11 //主要删除最小值的函数代码 ,由此可见删除了最小值1,位于数组0的位置 12 bool

_DataStructure_C_Impl:在顺序表中查找元素

// _DataStructure_C_Impl:Search #include<stdio.h> #include<stdlib.h> #define MaxSize 100 #define IndexSize 20 typedef int KeyType; //元素的定义 typedef struct{ KeyType key; }DataType; //顺序表的类型定义 typedef struct{ DataType list[MaxSize]; int length; }

顺序表中基本操作

前言:最近玩esp8266和ucos-iii以及在学c++比较多,接触的大部分都是指针.结构体.链表:刚好自己又在看数据结构(数据结构真的非常重要,要好好学,是学算法的敲门砖,哈哈哈),个人看法在对顺序表进行元素增和删操作,效率比较低(要移动非常多的其他元素),而我之前写的对链表操作,使用指针操作,效率就高多了.好了,来看今天的学习总结吧! 一.顺序表的初始化: 算法步骤: 1.为顺序表L动态分配一个预定义大小的数组空间,使elem指向这段空间的基地址 2.将表的当前长度设为0 伪代码实现: S

编程实现顺序表的以下基本操作:建立顺序表,修改顺序表,插入顺序表,删除顺序表。

#include <iostream> #include <stdio.h> #include <stdlib.h> using namespace std; typedef int ElemType; typedef int Status; #define OK 1 #define ERROR 0 #define OVERFLOW -2 #define LIST_INIT_SIZE 100 #define LISTINCREMENT 10 ElemType * new

MSSQL如何在没有主键的表中删除重复数据

为了对重复数据进行实验,下面建一个设计不太好(没有主键)表并插入了一些重复数据: create database testdb use testdb ; go create table DupsNoPK (Col1 int Null, Col2 char(5) Null ); go insert DupsNoPK(Col1,Col2) Values(1,'abc'), (2,'abc'), (2,'abc'), (2,'abc'), (7,'xyz'), (7,'xyz'); 为了验证表确实有重

12 表中删除重复项

以下代码实现了从表中删除重复项的功能,请选择其中空白行应填入的正确代码(D) template<typename T> void removeDuplicates(list<T> &aList) {     T curValue;     list<T>::iterator cur, p;     cur = aList.begin();     while (cur != aList.end())     {         curValue = *cur;

解决在mysql表中删除自增id数据后,再添加数据时,id不会自增1的问题

https://blog.csdn.net/shaojunbo24/article/details/50036859 问题:mysql表中删除自增id数据后,再添加数据时,id不会紧接.比如:自增id 1 2 3 4 现在删除4,就变成了 1 2 3 这时候,如果增加一条数据,会变成 1 2 3 5 上面5不是我们想要的结果,4才是理想的id,解决方法是,在删除4之后,执行下面的sql语句: ALTER TABLE table_name AUTO_INCREMENT = 1; 原文地址:http

顺序表中的思路

在c语言当中判断数组的长度是比较麻烦的,不像其他语言可以通过对象的属性或者方法来获得长度. int arr[4]; int length = sizeof(arr)/sizeof(arr[0]); //数组占内存总空间,除以单个元素占内存空间大小 而有一种类似数组的数据结构叫线性表,可以用来很方便的获取数组的长度.其结构体为 typedef struct { int data[1024]; int last; } List; 该数据结构除了定义了一个长度为1024的数组外,还多定义一个变量las