简单数据结构

复杂度

一个算法的复杂度,会极大影响程序运行的效率,复杂度又分为时间复杂度和空间复杂度,时间复杂度取决于程序运行时基本语句的运算次数,空间复杂度取决于程序运行时所占用的存储空间。复杂度是规模的量级,和数据量的大小成比例,当数据量基数足够大时,算法的优劣就会显示出来。

  • 表示方法:O(n^n),O(n!),O(n),O(1),O(nlogn)等
    评估算法的效率,就需要评估耗费的时间(计算机)和空间(储存占用),主要是相对于输入数据N的比例。

  • 关键点:不同时间复杂度对输入数据量的成长速度是不一样的
    例如:输入数据量为1000时,复杂度为O(n)的算法需要进行1000次基本语句运算,而O(n^2)需要1000000次运算,时间差异是巨大的。因此,解决复杂问题时,要尽可能降低算法的复杂度,以提高程序运行的效率。

Complexity
  • 简单判断方法
    1. 数多少个循环嵌套,层数对应于N的次方数
    2. 二分结构一般包含logn

哈希表

  • 哈希表:提供储存Key-Value键值对的数据结构,其中键值均可以为任意类型

  • 特性:储存在哈希表里的数据没有顺序,不可以对哈希表进行排序

  • 基本实现原理:把任意的Key值转换成数字,然后作为数组的下标,再将Value存储在数组下标对应位置上

  • 数组对比:

    1. 可以使用下标索引去访问存储的数据
    2. 两者的Value均支持任意类型

    1. 数组的Key只支持数字,而哈希表的Key支持任意类型
    2. 数组的部分操作,例如在数组中插入数据的操作,时间复杂度为O(n),而哈希表所有操作(增删改查)时间复杂度都近似于O(1)

操作

// 哈希表的建立,键值可为任意类型
HashMap<String, String> nickname = new HashMap<String, String>();

// 用put方法来往哈希表中增加键值对
nickname.put("LiMing", "Ming");
nickname.put("ZiHao", "Wanz");

// 用remove方法来移除键值对
nickname.remove("ZiHao");
// nickname.remove("Chen");不会抛出异常

// 改和增一样,用put方法来覆盖键值对
nickname.put("LiMing","Li");

// 先用那个containsKey方法判断键值是否存在
if (nickname.containsKey("LiMing")) {
    
    // 存在则用get方法读取,不存在get会返回null
    System.out.println(nickname.get("LiMing"));
}

// 结果
Li
  • 优点:增删改查操作的时间复杂度都近似于O(1),不依赖于插入的顺序,随机访问,查找快,想访问哪个数据就马上访问哪个数据

  • 缺点:牺牲了顺序

  • :一种只能访问最近放入数据的数据结构

  • 特性
    1. 不可以随机访问,还能按栈堆数据的访问顺序进行,先进后出,后进先出
    2. 除头尾节点之外,每个元素有一个前驱,一个后继
    3. 所有操作的时间复杂度O(1)

操作

推入

// 新建一个整型栈堆
Stack<Integer> stack = new Stack<Integer>();

// push方法推入数据,放在栈的顶端
stack.push(6);

弹出

// pop方法取出数据,同时从列表中删除
stack.pop();    //6

查看栈顶数据

stack.push(4);
stack.push(7);

// peek方法查看栈顶数据,但不移除
stack.peek();   //7

判定是否为空栈

stack.isEmpty();    // 返回boolean类型

函数调用栈(递归)

function f1() {
f2();
...
}

function f2(){
f3();
...
}

调用顺序:f1(); -> f2(); ->f3();
调用f1()时,会把f1()的状态装入栈中,再调用f2()

队列

  • 队列:类似于栈的数据结构,区别在于只能访问最早放入的数据

  • 特性
    1. 不可以随机访问,先进先出,后进后出
    2. 除头尾节点之外,每个元素有一个前驱,一个后继
    3. 所有操作的时间复杂度O(1)

操作

推入

// 新建一个整型队列
Queue<Integer> queue = new LinkedList<Integer>();

// add方法推入数据
queue.add(6);

弹出

// poll方法弹出数据
queue.poll();   //6

查看

queue.add(3);
queue.add(4);

// peek方法查看第一个数据
queue.peek();   //3

判定是否为空队列

queue.isEmpty();    // 返回boolean类型
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,175评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,674评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,151评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,597评论 1 269
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,505评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,969评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,455评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,118评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,227评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,213评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,214评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,928评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,512评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,616评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,848评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,228评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,772评论 2 339

推荐阅读更多精彩内容