- 浏览: 189777 次
- 性别:
- 来自: 自己输入城市...
文章分类
- 全部博客 (128)
- Java (13)
- Util (21)
- IO (1)
- Thread (4)
- Net (0)
- Design Patterns (0)
- Training (4)
- ----------------- (0)
- JS-1 (15)
- JS-3 (7)
- AJAX (3)
- AS (2)
- ------------------- (0)
- HTML (3)
- CSS (3)
- Art (15)
- -------------------- (0)
- RegExp (4)
- --------------------- (0)
- SQL (6)
- Servlet $ JSP (2)
- JDBC (2)
- ---------------------- (0)
- Bird (3)
- Setting (7)
- DL (4)
- PHP (4)
最新评论
-
durong11:
或者直接在函数的中加入:if(head.data.equals ...
我的Java单链表练习 -
durong11:
一种解释是:如果是从头结点insert 直接使用addFrom ...
我的Java单链表练习 -
老肥猴_vi:
谢谢。但是貌似insert函数( public boolean ...
我的Java单链表练习 -
niepeng880208:
支持
List转换成String数组 -
haohao-xuexi02:
EventHelp
幻灯片效果
最适合用STree排序的是不可变类,不可变类的主要特征是它的对象的属性不能被修改.
二叉排序树操作的复杂度
最好情况: 完全树
最坏情况: 在二叉排序树为退化树时,add()和remove()处于最坏情况,相当于一个链表,可以通过红黑树消除最坏情况.
Iterator接口
测试类
public class Customer implements Comparable<Object>{ private final String name; private final int age; ... }
二叉排序树操作的复杂度
最好情况: 完全树
最坏情况: 在二叉排序树为退化树时,add()和remove()处于最坏情况,相当于一个链表,可以通过红黑树消除最坏情况.
Iterator接口
package BinarySearchTree; public interface Iterator<T> { public boolean hasNext(); public T next(); public void remove(); }
package BinarySearchTree; import java.util.ConcurrentModificationException; import java.util.NoSuchElementException; public class STree<T> implements Cloneable { /**结点内部类*/ private static class STNode<T> { T nodeValue; STNode<T> left, right, parent; /**结点类构造函数*/ public STNode(T item, STNode<T> parentNode) { nodeValue = item; left = null; right = null; parent = parentNode; } } /**二叉搜索树类成员变量*/ private STNode<T> root; private int treeSize; private int modCount; /**二叉搜索树类构造函数*/ public STree() { root = null; treeSize = 0; modCount = 0; } /**插入方法*/ public boolean add(T item) { STNode<T> t = root, parent = null, newNode; int orderValue = 0; // 循环终止条件在一个空的子树上 while(t != null) { // 更新父结点的引用 parent = t; // 比较item与当前结点的值 orderValue = ((Comparable<T>)item).compareTo(t.nodeValue); // 比较item与当前结点的值,小于零往左走,否则向右走,等于零将不能插入新值 if(orderValue == 0) return false; else if(orderValue < 0) t = t.left; else t = t.right; } // 创建新结点 newNode = new STNode<T>(item, parent); // 下面几句是父结点与子结点的连接操作 if(parent == null) // 这是第一个被添加的结点,使它成为根结点 root = newNode; else if(orderValue < 0) // 连接新结点作为父结点的左孩子 parent.left = newNode; else // 连接新结点作为父结点的右孩子 parent.right = newNode; // 增加tree size and modCount treeSize++; modCount++; return true; } /**定位结点*/ public T find(T item) { STNode<T> t = findNode(item); T value = null; if (t != null) value = t.nodeValue; return value; } private STNode<T> findNode(Object item) { STNode<T> t = root; int orderValue; while(t != null) { orderValue = ((Comparable<T>)item).compareTo(t.nodeValue); if(orderValue == 0) return t; else if(orderValue < 0) t = t.left; else t = t.right; } return null; } /**删除结点*/ public boolean remove(Object item) { STNode<T> dNode = this.findNode(item); if(dNode == null) return false; removeNode(dNode); treeSize--; modCount++; return true; } private void removeNode(STNode<T> dNode) { if(dNode == null) return; // dNode: 待删除结点 // pNode: 待删除结点的父结点 // rNode: 待删除结点的替换结点 STNode<T> pNode, rNode; pNode = dNode.parent; // 待删除的结点至少具有一棵空子树 if(dNode.left == null || dNode.right == null) { // 找替换结点 if(dNode.right == null) rNode = dNode.left; else rNode = dNode.right; if(rNode != null) rNode.parent = pNode; // 连接操作 if(pNode == null) root = rNode; else if(((Comparable<T>)dNode.nodeValue).compareTo(pNode.nodeValue) < 0) pNode.left = rNode; else pNode.right = rNode; // 待删除的结点具有两个非空子树 }else { // pOfRNode: 替换结点的父结点 STNode<T> pOfRNode = dNode; rNode = dNode.right; pOfRNode = dNode; while(rNode.left != null) { pOfRNode = rNode; rNode = rNode.left; } dNode.nodeValue = rNode.nodeValue; if(pOfRNode == dNode) dNode.right = rNode.right; else pOfRNode.left = rNode.right; if(rNode.right != null) rNode.right.parent = pOfRNode; dNode = rNode; } dNode = null; }// end removeNode~ /** 返回最小值*/ public T first() { STNode<T> nextNode = root; if(nextNode == null) return null; while(nextNode.left != null) nextNode = nextNode.left; return nextNode.nodeValue; } /** 返回最大值*/ public T last() { STNode<T> nextNode = root; if(nextNode == null) return null; while(nextNode.right != null) nextNode = nextNode.right; return nextNode.nodeValue; } /**清除树*/ public void clear() { this.deleteTree(root); root = null; treeSize = 0; } private void deleteTree(STNode<T> t) { if(t != null) { deleteTree(t.left); deleteTree(t.right); t = null; } } public Object clone() { STree<T> copy = null; try { copy = (STree<T>)super.clone(); }catch (CloneNotSupportedException cnse){ throw new InternalError(); } copy.root = copyTree(root); // return the cloned object return copy; } /**后根遍历由底向上复制一棵树*/ private static<T> STNode<T> copyTree(STNode<T> t) { STNode<T> newLeft, newRight, newNode; if(t == null) return null; newLeft = copyTree(t.left); newRight = copyTree(t.right); newNode = new STNode<T>(t.nodeValue, null); newNode.left = newLeft; newNode.right = newRight; if(newLeft != null) newLeft.parent = newNode; if(newRight != null) newRight.parent = newNode; return newNode; } public boolean contains(Object item) { STNode<T> t = findNode(item); return (t == null) ? false : true; } public int size() { return treeSize; } public boolean isEmpty() { return treeSize == 0; } public Object[] toArray() { Iterator<T> iter = this.iterator(); Object[] arr = new Object[treeSize]; int i = 0; while(iter.hasNext()) { arr[i] = iter.next(); i++; } return arr; } public String toString() { int i; String str = "["; Iterator<T> iter = this.iterator(); for (i = 0; i < treeSize; i++) { str += iter.next(); if(i < treeSize - 1) str += ", "; } str += "]"; return str; } /**二叉搜索树跌代器的公共方法*/ public Iterator<T> iterator() { return new MyIterator(); } /**MyIterator内部类*/ private class MyIterator implements Iterator<T> { private int expectedModCount = modCount; private STNode<T> tmp = null; private STNode<T> nextNode = null; MyIterator() { nextNode = root; if(nextNode != null) { while(nextNode.left != null) nextNode = nextNode.left; } } public boolean hasNext() { return nextNode != null; } public T next() { checkIteratorState(); if(nextNode == null) throw new NoSuchElementException( "Iteration has no more elements"); tmp = nextNode; STNode<T> p; if(nextNode.right != null) { nextNode = nextNode.right; while(nextNode.left != null) nextNode = nextNode.left; }else { p = nextNode.parent; while(p != null && nextNode == p.right) { nextNode = p; p = p.parent; } nextNode = p; } return tmp.nodeValue; } public void remove() { // check for a missing call to next() or previous() if (tmp == null) throw new IllegalStateException( "Iterator call to next() " + "required before calling remove()"); // make sure our state is good checkIteratorState(); // if lastReturned has two children, the replacement node // during deletion is nextNode. the value in nextNode // is copied to lastReturned. nextNode must be // lastReturned if (tmp.left != null && tmp.right != null) nextNode = tmp; removeNode(tmp); // list has been modified modCount++; expectedModCount = modCount; // we did a deletion. indicate this by setting lastReturned // to null and decrementing treeSize tmp = null; treeSize--; } private void checkIteratorState() { if (expectedModCount != modCount) throw new ConcurrentModificationException( "Inconsistent iterator"); } }//end MyIterator~ }//end STree~
测试类
package BinarySearchTree; // 要实现Comparable接口,然后重写compareTo方法 public class Customer implements Comparable<Object>{ private String name; private int age; public Customer(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } public void setName(String name) { this.name = name; } public void setAge(int age) { this.age = age; } public int compareTo(Object o) { Customer other = (Customer)o; if(this.name.compareTo(other.name) > 0) return 1; if(this.name.compareTo(other.name) < 0) return -1; if(this.age > other.age) return 1; if(this.age < other.age) return -1; return 0; } public static void main(String[] args) { STree<Customer> sT = new STree<Customer>(); Customer c1 = new Customer("Tom", 32); Customer c2 = new Customer("Jack", 12); Customer c3 = new Customer("Lucy", 22); sT.add(c1); sT.add(c1); sT.add(c2); sT.add(c3); Iterator<Customer> it = sT.iterator(); while(it.hasNext()) { Customer c = it.next(); System.out.println(c.getName() + " " + c.getAge()); } Customer minAge = sT.first(); System.out.println("minAge: " + minAge.getName() + " " + minAge.getAge()); Customer f = sT.find(c2); f.setAge(42); System.out.println("find: " + f.getName() + " " + f.getAge()); System.out.println(sT.contains(c3)); sT.clear(); System.out.println(sT.size()); } }
发表评论
-
优先队列的实现
2008-05-11 05:00 983package Heap; import MyInter ... -
堆操作
2008-05-11 02:06 1004Comparator接口 package MyInterfac ... -
HashSet 类的实现
2008-04-28 16:03 1203package Hash; import MyInter ... -
HashMap类的实现
2008-04-28 12:20 1549package Hash; import java.ut ... -
Hash类的实现
2008-04-27 15:10 853package Hash; import java.util ... -
散列表的设计-->线性探查法
2008-04-24 09:07 1939性能分析: 散列表中条目数的比例较小时,使用线性探查法的效率较 ... -
二叉排序树的TreeMap类设计
2008-04-23 23:29 1966Iterable接口 package MyInterface; ... -
java集合操作
2008-04-23 23:26 3036package Sets; import java.util ... -
InorderIterator类的实现
2008-04-07 08:41 972接口的定义: public interface MyItera ... -
BinaryTree遍历练习::表达式树
2008-04-05 14:35 1799package ExpressionTree; import ... -
二叉树遍历
2008-03-31 01:48 1128二叉树的高度 图(1) /**用后根遍历求二叉树的高度*/ ... -
有界队列
2008-03-26 00:14 1019package Queue; import java.uti ... -
Stack练习:: 中缀-后缀表达式
2008-03-21 17:18 1793package Stack.Calculate; imp ... -
链式队列的实现
2008-03-21 17:05 1361package Queue; import java.u ... -
Stack练习:: 十进制正整数转化成二进制
2008-03-17 16:09 1355include "stdio.h" in ... -
顺序栈的实现
2008-03-14 00:16 1098package Stack; /** * 顺序栈的实现 ... -
数据结构 Java循环双向链表
2008-03-08 17:33 3159■ 构造函数 每个构造函数都通过 this 来初始化链接域 p ... -
我的Java单链表练习
2008-03-06 19:14 3041package LinkedList; /** * ... -
我的ArrayList实现
2008-03-04 21:26 1393package ArrayList; /** * < ... -
[转]数据结构 用Java实现单链表
2007-11-28 12:56 17572007-08-24 页面自动刷 ...
相关推荐
修炼成Javascript中级程序员必知必会_资源分享
内容概要:本文详细介绍了如何使用MATLAB的深度学习工具箱,在果树病虫害识别任务中从数据准备、模型设计、训练优化到最后的模型评估与应用全流程的具体实施步骤和技术要点。涵盖了MATLAB深度学习工具箱的基本概念及其提供的多种功能组件,如卷积神经网络(CNN)的应用实例。此外,文中还具体讲述了数据集的收集与预处理方法、不同类型的深度学习模型搭建、训练过程中的超参数设定及其优化手段,并提供了病虫害识别的实际案例。最后展望了深度学习技术在未来农业领域的潜在影响力和发展前景。 适合人群:对深度学习及农业应用感兴趣的科研人员、高校师生和相关从业者。 使用场景及目标:①希望掌握MATLAB环境下构建深度学习模型的方法和技术细节;②从事果树病虫害管理研究或实践,寻找高效的自动化解决方案。 阅读建议:在阅读本文之前,建议读者熟悉基本的MATLAB编程环境及初步了解机器学习的相关概念。针对文中涉及的理论和技术难点,可以通过官方文档或其他教程进行补充学习。同时,建议动手实践每一个关键点的内容,在实践中加深理解和掌握技能。
nodejs010-nodejs-block-stream-0.0.7-1.el6.centos.alt.noarch.rpm
机械模型与技术交底书的融合:创新点详解与解析,机械模型加技术交底书,有创新点 ,机械模型; 技术交底书; 创新点,创新机械模型与技术交底书详解
免费JAVA毕业设计 2024成品源码+论文+数据库+启动教程 启动教程:https://www.bilibili.com/video/BV1SzbFe7EGZ 项目讲解视频:https://www.bilibili.com/video/BV1Tb421n72S 二次开发教程:https://www.bilibili.com/video/BV18i421i7Dx
免费JAVA毕业设计 2024成品源码+论文+数据库+启动教程 启动教程:https://www.bilibili.com/video/BV1SzbFe7EGZ 项目讲解视频:https://www.bilibili.com/video/BV1Tb421n72S 二次开发教程:https://www.bilibili.com/video/BV18i421i7Dx
nodejs010-nodejs-cmd-shim-1.1.0-4.1.el6.centos.alt.noarch.rpm
西门子四轴卧加后处理系统:828D至840D兼容,四轴联动高效加工解决方案,支持图档处理及试看程序。,西门子四轴卧加后处理,支持828D~840D系统,支持四轴联动,可制制,看清楚联系,可提供图档处理试看程序 ,核心关键词:西门子四轴卧加后处理; 828D~840D系统支持; 四轴联动; 制程; 联系; 图档处理试看程序。,西门子四轴卧加后处理程序,支持多种系统与四轴联动
基于黏菌优化算法(SMA)的改进与复现——融合EO算法更新策略的ESMA项目报告,黏菌优化算法(SMA)复现(融合EO算法改进更新策略)——ESMA。 复现内容包括:改进算法实现、23个基准测试函数、多次实验运行并计算均值标准差等统计量、与SMA对比等。 程序基本上每一步都有注释,非常易懂,代码质量极高,便于新手学习和理解。 ,SMA复现;EO算法改进;算法实现;基准测试函数;实验运行;统计量;SMA对比;程序注释;代码质量;学习理解。,标题:ESMA算法复现:黏菌优化与EO算法融合改进的实证研究
基于MATLAB的Stewart平台并联机器人仿真技术研究与实现:Simscape环境下的虚拟模拟分析与应用,MATLAB并联机器人Stewart平台仿真simscape ,MATLAB; 并联机器人; Stewart平台; 仿真; Simscape; 关键技术。,MATLAB中Stewart平台并联机器人Simscape仿真
Grad-CAM可视化医学3D影像
探索comsol泰勒锥:电流体动力学的微观世界之旅,comsol泰勒锥、电流体动力学 ,comsol泰勒锥; 电流体动力学; 锥形结构; 电场影响,COMSOL泰勒锥与电流体动力学研究
免费JAVA毕业设计 2024成品源码+论文+数据库+启动教程 启动教程:https://www.bilibili.com/video/BV1SzbFe7EGZ 项目讲解视频:https://www.bilibili.com/video/BV1Tb421n72S 二次开发教程:https://www.bilibili.com/video/BV18i421i7Dx
PFC6.03D模型动态压缩模拟与SHPB霍普金森压杆系统理论及实验数据处理技术解析,PFC6.03D模型,动态压缩模拟,还包括: SHPB霍普金森压杆系统理论知识介绍,二波法和三波法处理实验数据,提出三波波形,计算动态压缩强度等 ,PFC模型; 动态压缩模拟; SHPB霍普金森压杆系统; 理论介绍; 二波法处理; 三波法处理; 三波波形; 动态压缩强度。,"PFC模型下的动态压缩模拟及SHPB理论实践研究"
ProASCI 开发板原理图,适用于A3P3000
免费JAVA毕业设计 2024成品源码+论文+录屏+启动教程 启动教程:https://www.bilibili.com/video/BV1SzbFe7EGZ 项目讲解视频:https://www.bilibili.com/video/BV1Tb421n72S 二次开发教程:https://www.bilibili.com/video/BV18i421i7Dx
1、文件内容:pykde4-devel-4.10.5-6.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/pykde4-devel-4.10.5-6.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装
基于Comsol模拟的三层顶板随机裂隙浆液扩散模型:考虑重力影响的瞬态扩散规律分析,Comsol模拟,考虑三层顶板包含随机裂隙的浆液扩散模型,考虑浆液重力的影响,模型采用的DFN插件建立随机裂隙,采用达西定律模块中的储水模型为控制方程,分析不同注浆压力条件下的浆液扩散规律,建立瞬态模型 ,Comsol模拟; 随机裂隙浆液扩散模型; 浆液重力影响; DFN插件; 达西定律模块储水模型; 注浆压力条件; 浆液扩散规律; 瞬态模型,Comsol浆液扩散模型:随机裂隙下考虑重力的瞬态扩散分析
A simple fast, easy use distributed file system written by golang(similar fastdfs).go-fastdfs
手机编程-1738391552157.jpg