链式存储结构的插入和删除不是时间复杂度为On吗
线性存储才是O1吧 这不是刚好是他们的优缺点吗
public static void main(String[] args) {
int sum = 0;
int n=100;
for (int i = 1; i <= n; i++) {
sum += i;
}
System.out.println("sum=" + sum);
}
public static void main(String[] args) {
int sum=0,n=100;
for (int i = 1; i <=n ; i++) {
for (int j = 1; j <=n ; j++) {
sum+=i; }
}
System.out.println(sum);
}
public static void main(String[] args) {
int x=0,n=100;
for (int i = 1; i <=n ; i++) {
for (int j = i; j <=n ; j++) {
for (int j = i; j <=n ; j++) {
x++;
}
}
}
System.out.println(x);
}
int i=1,n=100;
while(i<n){
i = i*2;
}
public static void main(String[] args) {
int n=100;
int i=n+2;
System.out.println(i);
}
链式存储结构的时间复杂度及与线性存储结构的优缺点比较
链式存储结构是通过节点之间的指针相连的方式存储数据,而线性存储结构是将数据顺序存储在一片连续的存储空间内。
对于链式存储结构,插入和删除操作的时间复杂度取决于节点的位置。如果需要插入或删除节点,需要先找到节点的前一个节点,然后通过修改指针的指向来完成操作。因此,链式存储结构的插入和删除操作的时间复杂度是O(n),其中n为链表长度。
相比之下,线性存储结构的插入和删除操作的时间复杂度是O(1),只需要通过移动数组中的元素来完成操作。但是,线性存储结构需要预留一定的空间,如果空间不够,需要进行动态扩展或缩减操作,同时也会增加复杂度和开销。
总体而言,链式存储结构比线性存储结构更加灵活,可以动态地管理内存空间。此外,链式存储结构可以方便地进行插入和删除操作,而线性存储结构则适用于需要随机访问元素的场合。因此,在实际应用中,需要根据具体的需求选择恰当的存储结构。
参考代码:
链式存储结构的节点定义:
struct Node{
int val;
Node* next;
Node(int x) : val(x), next(NULL) {}
};
实现链表的插入操作,需要先找到插入位置的前一个节点,然后将新节点插入到其后:
void insert(Node* preNode, int value){
if(preNode == NULL) return;
Node* newNode = new Node(value);
newNode->next = preNode->next;
preNode->next = newNode;
}
实现链表的删除操作,需要先找到待删除节点的前一个节点,然后通过修改指针的指向来删除节点:
void remove(Node* preNode){
if(preNode == NULL || preNode->next == NULL) return;
Node* target = preNode->next;
preNode->next = target->next;
delete target;
}
线性存储结构可以使用vector容器来实现,其中vector自带动态扩展和缩减的功能。在插入和删除元素时,需要移动后面的元素,因此需要O(n)的时间复杂度。但是,在随机访问元素时,vector的时间复杂度是O(1)。
#include <iostream>
#include <vector>
using namespace std;
int main(){
vector<int> vec;
vec.push_back(1); //在数组末尾插入元素
vec.push_back(2);
vec.push_back(3);
vec.insert(vec.begin() + 1, 4); //在指定位置插入元素
vec.erase(vec.begin() + 2); //删除指定位置的元素
for(int i = 0; i < vec.size(); ++i){
cout << vec[i] << " ";
}
return 0;
}
线性存储的定位(读)操作的复杂度是O(1)
插入可不是,需要从后往前搬动数据,是O(n)