当前位置: 首页 > news >正文

Java基础随笔2

继续上回:

————————————————————————————————————————————————————————————————————————————————

以下部分转自:https://github.com/crossoverJie/Java-Interview/blob/master/MD/LinkedList.md

LinkedList 底层分析

如图所示 LinkedList 底层是基于双向链表实现的,也是实现了 List 接口,所以也拥有 List 的一些特点(JDK1.7/8 之后取消了循环,修改为双向链表)。

新增方法

    public boolean add(E e) {
        linkLast(e);
        return true;
    }
     /**  * Links e as last element.  */ void linkLast(E e) { final Node<E> l = last; final Node<E> newNode = new Node<>(l, e, null); last = newNode; if (l == null) first = newNode; else l.next = newNode; size++; modCount++; }

可见每次插入都是移动指针,和 ArrayList 的拷贝数组来说效率要高上不少。

查询方法

    public E get(int index) {
        checkElementIndex(index);
        return node(index).item;
    }
    
    Node<E> node(int index) { // assert isElementIndex(index); if (index < (size >> 1)) { Node<E> x = first; for (int i = 0; i < index; i++) x = x.next; return x; } else { Node<E> x = last; for (int i = size - 1; i > index; i--) x = x.prev; return x; } }

由此可以看出是使用二分查找来看 index 离 size 中间距离来判断是从头结点正序查还是从尾节点倒序查。

  • node()会以O(n/2)的性能去获取一个结点
    • 如果索引值大于链表大小的一半,那么将从尾结点开始遍历

这样的效率是非常低的,特别是当 index 越接近 size 的中间值时。

总结:

  • LinkedList 插入,删除都是移动指针效率很高。
  • 查找需要进行遍历查询,效率较低。

————————————————————————————————————————————————————————————————————————————————————————————

LinkedList内容较为简单,没什么特别难得内容。查找时主要使用的是二分查找,这里顺便总结以下相关的查找算法。

1.顺序查找(最无脑查找)适合于存储结构为顺序存储或链接存储的线性表,顺序查找的时间复杂度为O(n)。

int SequenceSearch(int a[], int value, int n)
{
    int i;
    for(i=0; i<n; i++)
        if(a[i]==value)
            return i;
    return -1;
}

2.二分查找

元素必须是有序的,如果是无序的则要先进行排序操作,期望时间复杂度为O(log2n);

//二分查找,直接对半
int BinarySearch1(int a[], int value, int n)
{
int low, high, mid;
low = 0;
high = n-1;
while(low<=high)
{
mid = (low+high)/2;
if(a[mid]==value)
return mid;
if(a[mid]>value)
high = mid-1;
if(a[mid]<value)
low = mid+1;
}
return -1;
}

//二分查找,递归版本
int BinarySearch2(int a[], int value, int low, int high)
{
int mid = low+(high-low)/2;
if(a[mid]==value)
return mid;
if(a[mid]>value)
return BinarySearch2(a, value, low, mid-1);
if(a[mid]<value)
return BinarySearch2(a, value, mid+1, high);
}

3. 插值查找

基于二分查找算法,将查找点的选择改进为自适应选择,可以提高查找效率。当然,差值查找也属于有序查找。查找成功或者失败的时间复杂度均为O(log2(log2n))。

//插值查找
int InsertionSearch(int a[], int value, int low, int high)
{
int mid = low+(value-a[low])/(a[high]-a[low])*(high-low);
if(a[mid]==value)
return mid;
if(a[mid]>value)
return InsertionSearch(a, value, low, mid-1);
if(a[mid]<value)
return InsertionSearch(a, value, mid+1, high);
}

先列出三个简单的查找,后面重学数据结构和算法的时候再记录其他的树查找、哈希查找等等。

 

转载于:https://www.cnblogs.com/Aurel1ano/p/9185301.html

相关文章:

  • python3练习100题——026
  • Nodejs学习笔记(七)—Node.js + Express 构建网站简单示例
  • 求最短路径(Bellman-Ford算法与Dijkstra算法)
  • 49. Group Anagrams - LeetCode
  • 1 年经验 Java 求职面试题
  • 有赞11·11:全链路压测方案设计与实施详解
  • 输入处理与安全性
  • 基于结构的距离度量
  • partprobe 和 partx 的用法
  • 开发环境问题
  • 【咸鱼教程】本地图片上传。动态GIF表情图生成
  • HTML_列表标签
  • docker基础
  • jstack
  • linux常用命令与终端快捷键总结
  • ECMAScript6(0):ES6简明参考手册
  • java正则表式的使用
  • Material Design
  • maya建模与骨骼动画快速实现人工鱼
  • React as a UI Runtime(五、列表)
  • React组件设计模式(一)
  • 多线程事务回滚
  • 分类模型——Logistics Regression
  • 服务器之间,相同帐号,实现免密钥登录
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 聚簇索引和非聚簇索引
  • 设计模式(12)迭代器模式(讲解+应用)
  • 小程序开发中的那些坑
  • 用quicker-worker.js轻松跑一个大数据遍历
  • mysql面试题分组并合并列
  • #etcd#安装时出错
  • $.each()与$(selector).each()
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (简单) HDU 2612 Find a way,BFS。
  • (四)linux文件内容查看
  • (转载)Google Chrome调试JS
  • ******之网络***——物理***
  • .net 发送邮件
  • .Net7 环境安装配置
  • .Net的DataSet直接与SQL2005交互
  • .NET轻量级ORM组件Dapper葵花宝典
  • .NET设计模式(2):单件模式(Singleton Pattern)
  • /usr/local/nginx/logs/nginx.pid failed (2: No such file or directory)
  • [ SNOI 2013 ] Quare
  • [.net 面向对象程序设计进阶] (19) 异步(Asynchronous) 使用异步创建快速响应和可伸缩性的应用程序...
  • [04] Android逐帧动画(一)
  • [Android]使用Git将项目提交到GitHub
  • [AUTOSAR][诊断管理][ECU][$37] 请求退出传输。终止数据传输的(上传/下载)
  • [BZOJ] 2006: [NOI2010]超级钢琴
  • [BZOJ1040][P2607][ZJOI2008]骑士[树形DP+基环树]
  • [BZOJ4010]菜肴制作
  • [CISCN2019 华北赛区 Day1 Web2]ikun
  • [ERROR]-Error: failure: repodata/filelists.xml.gz from addons: [Errno 256] No more mirrors to try.