数据结构

LintCode刷题之路(一)

可紊 提交于 2021-02-20 04:39:36
在算法和数据结构上,我觉得我是一个彻彻底底的小白,开始刷题吧。 #阶梯训练 ###1. 两个字符串是变位词 ######写出一个函数 anagram(s, t) 判断两个字符串是否可以通过改变字母的顺序变成一样的字符串。 样例 给出 s = "abcd",t="dcab",返回 true. 给出 s = "ab", t = "ab", 返回 true. 给出 s = "ab", t = "ac", 返回 false. 首先看到这个题目 我们想到的就是字符串排序了,通过排序把字符调换成有顺序的字符串,再来比较。 所以就会出现以下代码 public class Solution { /** * @param s: The first string * @param b: The second string * @return true or false */ public boolean anagram(String s, String t) { //先查看长度是否相等,不相等则返回false if(s.length() != t.length()){ return false; } //转换成字符 然后排序 char[] sChar = s.toCharArray(); char[] tChar = t.toCharArray(); Arrays.sort(sChar);

JAVA内存泄漏——内存泄漏原因和内存泄漏检测工具(zt)

元气小坏坏 提交于 2021-02-17 23:04:06
摘要   虽然Java虚拟机(JVM)及其垃圾收集器(garbage collector,GC)负责管理大多数的内存任务,Java软件程序中还是有可能出现内存泄漏。实际上,这在大型项目中是一个常见的问题。避免内存泄漏的第一步是要弄清楚它是如何发生的。本文介绍了编写Java代码的一些常见的内存泄漏陷阱,以及编写不泄漏代码的一些最佳实践。一旦发生了内存泄漏,要指出造成泄漏的代码是非常困难的。因此本文还介绍了一种新工具,用来诊断泄漏并指出根本原因。该工具的开销非常小,因此可以使用它来寻找处于生产中的系统的内存泄漏。 垃圾收集器的作用   虽然垃圾收集器处理了大多数内存管理问题,从而使编程人员的生活变得更轻松了,但是编程人员还是可能犯错而导致出现内存问题。简单地说,GC循环地跟踪所有来自“根”对象(堆栈对象、静态对象、JNI句柄指向的对象,诸如此类)的引用,并将所有它所能到达的对象标记为活动的。程序只可以操纵这些对象;其他的对象都被删除了。因为GC使程序不可能到达已被删除的对象,这么做就是安全的。   虽然内存管理可以说是自动化的,但是这并不能使编程人员免受思考内存管理问题之苦。例如,分配(以及释放)内存总会有开销,虽然这种开销对编程人员来说是不可见的。创建了太多对象的程序将会比完成同样的功能而创建的对象却比较少的程序更慢一些(在其他条件相同的情况下)。   而且,与本文更为密切相关的是

学习数据结构 AVL树

一曲冷凌霜 提交于 2021-01-31 09:06:54
前一篇学习了二叉搜索树,本篇试图学习 AVL 树。可惜的是,Mehta 教授的《数据结构基础》一书中没有给出 删除算法,我还没研究清楚,只好先不写(学)删除部分了。 修改后的 TestTree.java 文件在这里: http://vdisk.weibo.com/s/3fAzF 以下是 insert 部分的代码,注释我已经写得挺清楚的了: public void insert(K key, V value) { this.checkValid(); // 检查现在树的有效性。 internal_insert(key, value); // 实际执行插入。 this.checkValid(); // 插入之后再检查一次。 } /** 内部实现 insert, 返回插入或更新的节点对象。 */ private boolean internal_insert(K key, V value) { if (this.root == null) { // 特定情况,简单处理。 this.root = new TreeNode<K,V>(key, value); return true; } // 第一步:查找 key 的插入位置。 boolean found = false; TreeNode<K, V> a = root, // 离插入点最近的 bf=+-1 的节点,也可能为 root(其

详解HashMap,Hashtable,LinkedHashMap,TreeMap的异同点

风格不统一 提交于 2021-01-30 13:56:39
Map Map是是一种数据结构,它是把数据按照key-value键值对的形式保存起来,一般来说,Map的定义是key是独一无二的,即存在map中的各个键一定是不能相同的。当然,对于一般的基本数据类型和String类型,对象都是可以自动比较的,建议键一般用不可变(immutable,可以参考我的另外一篇博文———不可变设计模式)类型。而对于其它的复杂类型,如果你没有在类中定义equals方法,则map中是可以存放相同的键的,因为它无法判断两个对象是否相同,所以在使用map存储数据时,键的数据类型一定要覆写equals方法,以提供可以判断两个对象是否相等的方法。 Map并不是Collection的一部分,即它是一个独立的接口,并没有继承Collection接口,因此它无法直接实现迭代器。但是它可以通过调用方法entrySet得到一个Set对象,而Set是Collection的一个类,因此Set可以生成迭代器。另外,Map内部还有一个EntrySet<K,V>接口,这个接口可以提供获取键-值的方法,非常方便。 HashMap HashMap内部是通过一个哈希函数来计算键的哈希值,然后内部含有一个数据结构用来存放键的哈希值,进而可以根据它的哈希值来检索键值对的位置。因此,如果你要将数据存进HashMap中,并且键的类型是一个自定义的类,该类要覆写equals方法以外

C++之typedef 小记

£可爱£侵袭症+ 提交于 2021-01-14 06:13:15
 以前曾不知道为何要用typedef,随着开发的深入,真正感受到了其内涵所在: 1.如:typedef int DataType 接下来项目中的几万行代码中,如果需要将所有的DataType改为float型,如果不用typedef工作量可想而知的;从而起到了精简代码的作用; 2.如下: typedef struc DataStru{ ........ ........ }MydataStru,*pMydataStru; 当你再定义数据结构时,如果是结构体,直接MydataStru就OK; 如果是结构体指针,直接pMydataStru就OK; 是不是简化你的程序了;其他过去赘余的例子不再举了,重在用心领悟; 哲学感悟:C++蕴含了太多的 哲学,存在就有其合理性 来源: oschina 链接: https://my.oschina.net/u/2344808/blog/397848

B树、B-树、B+树、B树都是什么

≡放荡痞女 提交于 2021-01-10 07:27:24
B 树、 B- 树、 B+ 树、 B* 树都是什么 B 树 即二叉搜索树: 1. 所有非叶子结点至多拥有两个儿子( Left 和 Right ); 2. 所有结点存储一个关键字; 3. 非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树; 如: B 树的搜索,从根结点开始,如果查询的关键字与结点的关键字相等,那么就命中;否则,如果查询关键字比结点关键字小,就进入左儿子;如果比结点关键字大,就进入右儿子;如果左儿子或右儿子的指针为空,则报告找不到相应的关键字; 如果 B 树的所有非叶子结点的左右子树的结点数目均保持差不多(平衡),那么 B 树的搜索性能逼近二分查找;但它比连续内存空间的二分查找的优点是,改变 B 树结构(插入与删除结点)不需要移动大段的内存数据,甚至通常是常数开销; 如: 但 B 树在经过多次插入与删除后,有可能导致不同的结构: 右边也是一个 B 树,但它的搜索性能已经是线性的了;同样的关键字集合有可能导致不同的树结构索引;所以,使用 B 树还要考虑尽可能让 B 树保持左图的结构,和避免右图的结构,也就是所谓的“平衡”问题; 实际使用的 B 树都是在原 B 树的基础上加上平衡算法,即“平衡二叉树”;如何保持 B 树结点分布均匀的平衡算法是平衡二叉树的关键;平衡算法是一种在 B 树中插入和删除结点的策略; B- 树 是一种多路搜索树(并不是二叉的):

内核同步机制——自旋锁

瘦欲@ 提交于 2020-12-10 06:35:33
由于关键代码区可以跨越了多个函数或数据结构,需要有更通用的同步方法:锁。 内核中最常见的一种锁就是自旋锁。相同的锁可用于多处。 自旋锁可用在不可睡眠的场景,如中断处理函数。自旋锁是一种互斥设备,只有两个值: “ 锁定 ” 和 “ 非锁定 ” 。它通常实现为一个整数值的某个比特位。想获取某个锁的代码首先测试相关的位,如果锁可得,则该位的 “ 锁定 ” 位被置位,代码继续执行,反之,代码将进入一个紧凑的循环,不停地检测锁定位直至自旋锁变得可得。该循环是自旋锁的 “ 旋转 ” 部分。自旋锁主要用于多处理器的情况下。 1. 通用自旋锁 相关操作: DEFINE_SPINLOCK(mr_lock) spinlock_tmy_lock = SPIN_LOCK_UNLOCKED;// 静态初始化 或 voidspin_lock_init(spinlock_t *lock);// 动态初始化 获取自旋锁 voidspin_lock(spinlock_t *lock);// 不可中断的 释放自旋锁 voidspin_unlock(spinlock_t *lock); 使用自旋锁时要禁止中断,禁止睡眠,并且应当尽可能减少占用自旋锁的时间。 其他函数 voidspin_lock(spinlock_t *lock); // 在获取自旋锁之前,禁止中断 voidspin_lock_irqsave

给初学者一封信

六眼飞鱼酱① 提交于 2020-11-27 04:44:59
我始终认为,对一个初学者来说,IT界的技术风潮是不可以追赶的,而且也没有能力去追赶。我时常看见自己的DDMM们把课本扔了,去卖些价格不菲的诸如C#, VB.Net 这样的大部头,这让我感到非常痛心。而许多搞不清指针是咋回事的BBS站友眉飞色舞的讨论C#里面可以不用指针等等则让我觉得好笑。C#就象当年的ASP一样,“忽如一夜春风来,千树万树梨花开”,结果许多学校的信息学院成了“Web 学院”。不少大学生都去做Web 了。当然我没有任何歧视某一行业的意识。我只是觉得如果他们把追赶这些时髦技术的时间多花一点在基础的课程上应该是可以走得更远的。 几个误区   初学者对C#风潮的追赶其实也只是学习过程中经常遇到的几个误区之一。我将用一些实际的例子来说明这些现象,你可以按部就班的看看自己是不是属于其中的一种或者几种: 认为计算机技术等于编程技术: 有些人即使没有这个想法,在潜意识中也有这样的冲动。让我奇怪的是,许多信息学院的学生也有这样的念头。认为计算机专业就是编程专业,与编程无关的,或者不太相关的课程他统统都不管,极端的学生只要书上没带“编程”两个字他就不看。 其实编程只是计算机技术应用过程中一种复杂性最低的劳动,这就是为什么IT业最底层的人是程序员(CODER)。计算机技术包括了多媒体,计算机网络,人工智能,模式识别,管理信息系统等等这些方面

用C写有面向对象特点的程序

廉价感情. 提交于 2020-11-20 07:06:05
转载自:陈皓 http://blog.csdn.net/haoel/archive/2003/04/02/2864.aspx 比如在一个项目中,有大量的数据结构,他们都是双向链表,但又想共用一套对链表的操作算法,这怎么做到呢,C中又没有C++中的继承,不然我可以继承一父(类中只有两个指针,一个向前一个向后),而其算法可以写在你类中的虚函数中,供子类使用。如: class Links { public: Links* back; Links* forword; virtual Add(){ ... }; virtual Del(){ ... }; virtual Ins(){ ... }; virtual Print() =0; .... }; 于是对于特定的数据结构我们可以: class mylinks : public Links { public: char* myname; char sex; int age; ... virtual Print(){ .... } }; 对其操作时都可以使用你类的泛型算法。 在C中,该如何做呢?我们用C中的指针和强制类型转可以做到。 下面是我总结出来的一个小的程序,体现了用指针的弹性来实现这一继承的效果:(我在Liniux下的GCC调试通过) ======================================= #include

常见数据结构(二)-树(二叉树,红黑树,B树)

醉酒当歌 提交于 2020-05-04 05:56:55
常见数据结构(二)-树(二叉树,红黑树,B树) 标签: algorithms [TOC] 本文介绍数据结构中几种常见的树:二分查找树,2-3树,红黑树,B树 写在前面 本文所有图片均截图自coursera上普林斯顿的课程 《Algorithms, Part I》 中的Slides 相关命题的证明可参考 《算法(第4版)》 源码可在 官网 下载,也可以在我的github仓库 algorithms-learning 下载,已经使用maven构建 仓库下载: git clone git@github.com:brianway/algorithms-learning.git Binary Search Tree(二分查找树) 定义:A BST is a binary tree in symmetric order . A binary tree is either: Empty. Two disjoint binary trees (left and right). Symmetric order.Each node has a key, and every node’s key is: Larger than all keys in its left subtree. Smaller than all keys in its right subtree. 在java的实现中,每个节点