遍历

链表为什么插入比数组快

心已入冬 提交于 2019-12-15 01:48:34
链表和数组是两种截然不同的内存组织方式,正因如此,它们插入、删除、随机访问的时间复杂度正好相反。 数组使用的是连续的内存空间,可以利用空间局部性原理,借助 CPU cache进行预读,所以访问效率更高。而链表不是连续存储,无法进行缓存,随机访问效率也较低。 数组的缺点是大小固定,一经声明就要占用整块连续的内存空间。如果声明的数组过大,系统可能没有足够的连续内存空间用于分配,就会导致“内存不足(out of memory)”。而如果声明的数组过小,当不够用时,又需要重新申请一块更大的内存,然后进行数据拷贝,非常费时。 而链表则没有大小限制,支持动态扩容。当然,因为链表中每个结点都需要存储前驱 / 后继结点的指针,所以内存消耗会翻倍。而且,对链表频繁的插入、删除操作会导致频繁的内存申请和释放,容易造成内存碎片和触发垃圾回收(Garbage Collection, GC) 数组和链表插入删除操作的时间复杂度对比: 在只知道下标时 数组:O(n) 需要移动其后所有项的位置 链表:O(n) 需要遍历其前面所有项以得到下标对应的项 在拥有要操作的项的引用时 数组:O(n) 需要移动其后所有项的位置 链表:O(1) 无需遍历 其实直接就插入删除的执行函数来看的话,链表和数组在只知道下标的情况下,其时间复杂度都是O(n),性能上是不会有太大差别的。因为数组不需要遍历,能直接取得要操作的对象

Object-C学习笔记(三)

那年仲夏 提交于 2019-12-14 19:42:48
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 住院好几天了。昨天刚安上无线网卡,写了半天笔记结果破输入法死机白忙活了,还得重搞。 NSArray 是Cocoa的一个类,用于存放对象,这个类不可以直接存放C中数据类型的数据,需要转换成Object-C的对象才可以。 创建一个NSArray对象的方法有很多,这里先说一个比较简单的方法。 + (NSArray) arrayWithObjects:(id) obj, ... count 用于获取NSArray中的对象个数 -(unsigned int) count; objectAtIndex 用于根据索引获取相应的对象,注意如果访问了不存在的索引,不会像PHP一样最多出现个Notice,将会导致程序崩溃,其实这是个好事,因为他会让你及时的修正,避免由于使用非法索引而导致出现难以调试的Bug。 - (id) objectAtIndex:(unsigned int)index; componentsJoinedByString 这个跟PHP中的implode类似,用于根据一个字符串来将数组连接成一个新的字符串。 - (NSString *) componentsJoinedByString:(NSString *)dec; componentsSeparatedByString 这个跟PHP中的explode类似

岛屿数量

安稳与你 提交于 2019-12-14 11:27:05
岛屿数量 给定一个由 '1' (陆地)和 '0' (水)组成的的二维网格,计算岛屿的数量。一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包围。 示例 1: 输入: 11110 11010 11000 00000 输出: 1 示例 2: 输入: 11000 11000 00100 00011 输出: 3 分析: 进行深度遍历或广度遍历,每进行一次遍历确定当前坐标所在地是不是一个岛屿。 广度遍历 class Solution { public: int numIslands(vector<vector<char>>& grid) { if(grid.size() < 1) return 0; // 岛屿数量 int count = 0; // 遍历每一个节点 for(int i=0; i<grid.size(); i++){ for(int j=0; j<grid[0].size(); j++){ // 进行广度遍历 if(BFS(grid,i,j)) count ++; } } return count; } /* 111 010 111 */ // 进行广度遍历,有节点就return bool BFS(vector<vector<char>>& grid, int x, int y){ if(grid[x][y] != '1')

二叉树结构的建立与遍历

坚强是说给别人听的谎言 提交于 2019-12-14 07:50:24
#include <stdio.h> #include <stdlib.h> #define MAX_LEN 50 /*二叉树的二叉链表结构*/ typedef struct node { struct node *lchild; struct node *rchild; char data; }BTREE; /*栈的数组实现*/ typedef struct { int top; BTREE *a[MAX_LEN]; //结构体数组,每个元素均为一个结点 }Stack; /*队列的数组实现*/ typedef struct { BTREE *a[MAX_LEN]; //结构体数组,每个元素均为一个结点 int front; int rear; }Queue; /*为栈分配空间*/ Stack *Createstack() { Stack *p; p = (Stack *)malloc(sizeof(Stack)); p->top = -1; return p; } /*为队列分配空间*/ Queue *Createqueue() { Queue *p; p = (Queue *)malloc(sizeof(Queue)); p->front = 0; p->rear = 0; return p; } /*菜单*/ int Menu() { int x; printf("\n\n"

数据结构之树

时光怂恿深爱的人放手 提交于 2019-12-14 07:26:28
数据结构之树(含代码) 树的基本概念 子树的个数没有限制,但它们一定是互不相交的 树的结点包含一个数据元素及若干指向其子树的分支;结点拥有的子树数称为结点的度;度为0的结点称为叶结点或终端结点;度不为0的结点称为非终端结点或分支结点;除根结点之外,分支结点也称为内部结点;树的度是树内各结点的度的最大值。 结点的层次从根开始定义起;树中结点的最大层次称为树的深度或高度; 如果将树中结点的各子树看成从左至右是有次序的,不能互换的,则称该树为有序树,否则称为无序树 双亲表示法 每个结点都有data和left,right,data是数据,存储结点的数据信息;而lef,rig是指针,存储该结点的双亲在数组中的下标;根结点没有双亲,所以指针域为-1; 二叉树 二叉树是n个结点的有限集合,该集合或者为空集,或者由一个根结点和两棵互不相交的、分别成为根结点的左子树和右子树的二叉树组成 二叉树的特点: 每个结点最多有两棵子树,所以二叉树中不存在度大于2的结点 左子树和右子树是有顺序的,次序不能任意颠倒 即使树中某结点只有一棵子树,也要区分它是左子树还是右子树 满二叉树:在一棵二叉树中,如果所有分支结点都存在左子树和右子树,并且所有叶子都在同一层上 特点: 叶子只能出现在最下一层 非叶子结点的度一定是2 在同样深度的二叉树中,满二叉树的结点个数最多,子树最多 完全二叉树

遍历二叉树

谁说胖子不能爱 提交于 2019-12-13 20:06:43
package com.example.demo.test; import java.util.LinkedList; import java.util.Queue; import java.util.Stack; public class Order { static class Tree { int value; Tree left; Tree right; public Tree(int value, Tree t1, Tree t2) { this.value = value; this.left = t1; this.right = t2; } } public static Tree init() { Tree J = new Tree(8, null, null); Tree H = new Tree(4, null, null); Tree G = new Tree(2, null, null); Tree F = new Tree(7, null, J); Tree E = new Tree(5, H, null); Tree D = new Tree(1, null, G); Tree C = new Tree(9, F, null); Tree B = new Tree(3, D, E); Tree A = new Tree(6, B, C); return

线索二叉树 C++

最后都变了- 提交于 2019-12-13 13:01:59
线索二叉树 C++ 以此二叉树为例进行创建: 前序法创建节点,输入’#'表示为NULL 用前序创建的话需要输入 :ABD##E##C#G## 前序遍历:ABD##E##C#G## 中序遍历:#D#B#E#A#C#G# 后序遍历: ##D##EB###GCA 层序遍历: ABCDEG 在进行线索二叉树线索化的过程中我们并不设置 头结点, 而是**直接设置一个全局变量 指针 Prev **, 表示指向上一个节点的位置 。 思想: 1.首先对创建好的二叉树利用一次中序遍历的过程设置好 lTag 与 rtag 。 在这个过程中 T指针负责设置 T->ltag(前驱), prev指针负责设置 prev->rtag(后继) 2.中序线索二叉树的遍历 ,由于设置了前驱和后继,就可以不使用栈, 直接用 迭代法 进行中序遍历。 ThreadBiTree.h # pragma once # include <iostream> using namespace std ; # define MAX 30 typedef char ElemType ; typedef struct ThreadBiNode { ElemType data ; struct ThreadBiNode * lchild , * rchild ; int ltag , rtag ; //0表示正常连接孩子, 1表示前缀后缀

剑指offer-24 二叉树中和为某一值的路径 -- Java实现

泄露秘密 提交于 2019-12-13 02:42:55
题目 输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前) 分析 思路一: 路径 : 从根节点开始 根据树的路径的定义,我们只能采用前序遍历。而又由于题目给的节点定义中为给出其父节点的指向,所以只能遍历的时候将遍历到的节点值一一存入一个“容器”并将该节点值累加。直到遍历到叶节点,如果当前值累加的和等于输入的整数,则存储该“容器”(路径)。如果不等于则需要返回到父节点再遍历另一子节点,这样我们就需要将“容器”当前的最后一个值删掉然后再存储。可以发现这种容器符合栈的“后进先出”规则。而我们采用递归实现这种“容器”的值的添加与删除,正好符合“后进先出”。 时间复杂度 :o(N) 空间复杂度 :o(N) 代码: import java . util . ArrayList ; /** public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } */ public class Solution { private ArrayList <

Java遍历Map的4种方式

允我心安 提交于 2019-12-13 00:25:25
public static void main ( String [ ] args ) { // 循环遍历Map的4中方法 Map < Integer , Integer > map = new HashMap < Integer , Integer > ( ) ; map . put ( 1 , 2 ) ; // 1. entrySet遍历,在键和值都需要时使用(最常用) for ( Map . Entry < Integer , Integer > entry : map . entrySet ( ) ) { System . out . println ( "key = " + entry . getKey ( ) + ", value = " + entry . getValue ( ) ) ; } // 2. 通过keySet或values来实现遍历,性能略低于第一种方式 // 遍历map中的键 for ( Integer key : map . keySet ( ) ) { System . out . println ( "key = " + key ) ; } // 遍历map中的值 for ( Integer value : map . values ( ) ) { System . out . println ( "key = " + value ) ; } /

简单易懂带你了解二叉树

巧了我就是萌 提交于 2019-12-12 19:31:37
前言 上一篇博客为大家介绍了 数组与链表 这两种数据结构,虽然它们在某些方面有着自己的一些优点,但是也存在着一些自身的缺陷,本篇博客为将为大家介绍一下数据结构--- 二叉树 ,它在保留数组和链表的优点的同时也改善了它们的缺点(当然它也有着自己的缺点,同时它的实现也比较复杂). 1. 数组和链表的特点 数组的优点: 简单易用. 无序数组的插入速度很快,效率为O(1) 有序数组的查找速度较快(较无序数组),效率为O(logN) 数组的缺点: 数组的查找、删除很慢 数组一旦确定长度,无法改变 链表的优点: 可以无限扩容(只要内存够大) 在链表头的新增、删除很快,效率为O(1) 链表的缺点: 查找很慢 在非链表头的位置新增、删除很慢,效率为O(N) 2.树和二叉树 树是一种数据结构,因为它数据的保存形式很像一个树,所以得名为树(树状图). 而二叉树是一种特殊的树, 它的每个节点最多含有两个子树 ,现实世界中的二叉树: 图1 但是实际中的二叉树却是 倒挂 的,如图: 图2 二叉树的名词解释: 根:树顶端的节点称为根。一棵树只有一个根,如果要把一个节点和边的集合称为树,那么从根到其他任何一个节点都必须有且只有一条路径。A是根节点。 父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点;B是D的父节点。 子节点:一个节点含有的子树的根节点称为该节点的子节点;D是B的子节点。 兄弟节点