51CTO博客开发
本章讲解的是快速排序算法,快速排序有很多变种,不过基本原理是一样的。int Partition(int *a, int low, int high) { int key = a[low]; while (low < high) { while (low < high
这里讲述的是用堆实现的最大优先级队列,建立的是最大堆,主要实现3个算法,一个是抽取对头元素,也就是整个堆里面最大的那个数,还有一个是提高某个节点的优先级,最后是往队尾插入元素。1、建立最大堆void build_max_heap(int *a, int i, int n) { int max = i; int left = 2 * i + 1; int right = 2
算法:// 对第i个节点构建最大堆 void build_max_heap(int *a, int i, int n) { int max = i; int left = 2 * i + 1; int right = 2 * i + 2; if (left < n && a[left] > a[m
1、插入排序算法:void InsertionSort(int *a, int n) { int i, j; for (i = 1; i < n; i++) { int key = a[i]; j = i - 1; while (j >= 0 && a[j] > key) {
在Android开发的时候,经常会使用到用c或c++编写的第三方的静态库。如果有源码的话,可以直接跟你自己的代码一去编译成动态库so,但是如果没有源码的话,你就必须在自己的动态库so里面将别人生成好的静态库导入进来一起编译了。我在编译的时候遇到了不少问题,我觉得有必要进行总结一下。下面我以一个简单的实际例子来讲解如何在动态库中导入静态库。静态库中的源代码有两个文件:static.h, static
我在Mac电脑上编译Android的内核源代码遇到了不少问题,下面对遇到的问题进行一个简单的总结,希望对大家有所帮助。 1、Android编译内核的源代码和编译Rom的源代码是分开的,因此如果要编译内核的话,需要单独下载。用git从谷歌的网站上克隆:git clone http://android.googlesource.com/kernel/goldfish.git注意这里不要用https,我
已经有很多人问我Android要怎么学,之前qq上聊天感觉都是些只言片语,我想是时候总结一下,把自己走过的一些路分享给大家,希望对大家有一点点的帮助。我接触Android也已经好几年了,现在由于公司发展需要,可能做的比较少了,但是脑海中还依然有些印象。在Android方面,我肯定不是什么专家,精通就更不用说了(最讨厌那种说自己精通xx技术的),充其量比大家早接触而已,相信如果大家肯努力的话,肯定可
今天做项目的时候,产品经理说要实现类似facebook那样侧滑菜单的效果,其实现在很多app都实现了类似的效果,比如网易新闻,搜狗输入板等。于是就在网上搜索其实现的原理,虽然也搜到了不少,但是发现它们实现的都过于复杂,代码看起来实在是费劲,我是一个非常注重简单明了的人,极力主张一切从简,能简单就一定不复杂,于是就自己尝试来实现了。首先简单说一下我实现的原理:需要两个UIView,一个是放在中间的C
抽象原型 Prototype.h & Prototype.m// // Prototype.h // PrototypeObc // // Created by hejinlai on 13-8-9. // Copyright (c) 2013年 yunzhisheng. All rights reserved. // #import <
抽象原型 Prototype.h & Prototype.cpp// // Prototype.h // Prototype // // Created by hejinlai on 13-8-9. // Copyright (c) 2013年 yunzhisheng. All rights reserved. // #ifndef __Pro
抽象原型 Prototype.java public abstract class Prototype implements Cloneable{ protected String name; public String getName() { return name; } public void setName(String name)
抽象产品A Product.h :// // ProductA.h // FactoryObc // // Created by hejinlai on 13-8-8. // Copyright (c) 2013年 yunzhisheng. All rights reserved. // #import <Foundation/Foundation.h&g
抽象产品A -> ProductA.h & ProductA.cpp :// // ProductA.h // AbstractFactory // // Created by hejinlai on 13-8-8. // Copyright (c) 2013年 yunzhisheng. All rights reserved. // #
一、java版抽象产品A -> ProductA.java : public interface ProductA { public void fun(); }具体产品A1 -> ProductA1.java :public class ProductA1 implements ProductA{ @Override public void
一、java版单例类 Singleton.java :public class Singleton { private static Singleton instance = null;
一、java版抽象产品 Product.java :/** * 抽象产品 * @author hejinlai * */ public interface Product { public void fun(); }第一个具体产品 ConcreteProduct.java :/** * 具体产品 * @author hejinlai * */ pub
一、java版抽象产品 Product.java :/** * 抽象产品 * @author hejinlai * */ public interface Product { public void fun(); }具体产品 ConcreteProduct.java :/** * 具体产品 * @author hejinlai * */ public
工具工具主要有以下3种:基本工具,不需要Xcode instruments。内存工具,验证内存使用的正确性和测试内存使用的效率。性能工具,测试你程序的每一个部分运行有多快以及精确的定位任何瓶颈。基本工具在本部分,我讨论的是在代码块中使用日志作为一个基本的工具来测试运行的时间。用日志记录运行的时间基本工具其中之一就是用日志来记录代码块开始和结束的时间。通常,记日志是用NSLog来实现的。使用这个基本
在本章,你将学到下面这些内容:模拟器和真机测试环境的不同。内存管理是如何影响一个app的性能。检测app的工具和技术包括: 1)基本的测试内存和性能的工具。 2)测试内存管理方面比较复杂的工具,比如内存泄露和bad access。 3)测试计算过程中性能方面比较复杂的工具,比如电池,文件加载,显示信息等。如何把你的程序分
根据前面的分析,语音识别调用的接口是Recognizer的recognizer方法,我们看下recognize方法:recognize只是调用了decoder的decode方法,转到decode方法:在decode方法中,先调用searchManager的startRecognition开始识别,然后在一个while循环中调用searchManager的recognize方法,recognize返
线程的可选方案有时候,你不想继承threads或不想自己创建和管理单独的线程。例如,你想要一个定时器每2秒钟调用你的方法,你可能会写一个线程一直循环,然后睡眠2秒,然后调用你的方法。或者你可能想要写代码处理异步请求,比如从网络上下载文件。或者当你的iPhone空闲时,你想要继续进行重量级的计算处理。这些都不太容易实现或者可能会降低性能。我会讨论一些解决的办法。NSTimerNSTimer并不承诺会
线程同步现在,让我们转向多线程另一个非常重要的部分。由于每一个线程都运行在自己的堆栈中,创建自己的对象,那么你的线程是如何和应用中的其他线程通讯和共享数据的呢?前面提到过,当你在多个线程中共享你的数据结构或对象时是有风险的,因为很多线程会试图改变对象的数据结构。首先,我向你介绍一个新的术语叫线程安全。线程安全类(或函数)是这样的类,你不需要担心之前提到的安全性问题。这些类要么很小心的使用了锁进行处
性能性能是在应用中使用多线程的主要原因。但是,正如你看到的,如果你使用不当的话,你的应用会有很多问题。你的应用会频繁的崩溃,如果你不能控制多线程带来的风险,就像我之前提到的。更进一步的,有些函数不能工作,因为有些线程会阻塞或永远等待。因此如果你的应用使用了多线程,你必须在担心性能之前确保你的应用正确运行。根据前面提到的这些问题,如果你的应用需要使用多线程来加速运行的话,你应该深思熟虑。为了决定一个
活跃性活跃性是指好的事情最终会发生。例如,如果你代码的目标是确保你能够持续从数组中push和pop对象,问题是这个过程是否能够永远工作。使用锁带来的问题是锁会引起系统中所有线程一直等待 -- 换句话说,就是死锁。如果你能保证你应用的活跃性,那么死锁应该永远都不会发生。问题想象你有两个线程:A和B。在Astart之前,A一直等待B结束。但是,在线程B继续运行之前,B一直等待线程A结束。对于一个实际的
线程的风险当运行在一个多线程环境中,你总是需要注意一些事情:你不能控制线程执行的顺序。例如,如果你有两个线程,线程1和线程2,CPU可能会在线程1上运行一段时间,然后又会切到线程2运行一段时间。问题是你不知道CPU何时切过去,也不知道会为一个线程分配多少时间。每个线程运行的时间都不是公平的。为了演示线程不容易控制带来的风险,我会举一个例子。这个例子包括两个线程:线程1和线程2. 线程1打印奇数,线
你的线程入口当启动线程时,你需要有一些代码来管理当前线程的状态,线程创建和执行的内存,还有在线程内部抛出的异常。原因是你新创建的线程会有自己的栈,它和默认的栈是不同的,如图 6-4。因此,你线程使用的内存和主线程使用的内存是不同的。异常也类似;它只会存储在你的栈中,并不会返回到主栈和主线程中。有很多事情你需要记住:Autorelease pool:管理autorelease对象ExceptionH
现在,我将会向你更深入的介绍如何使用之前提到的方法来创建新的operations。NSInvocationOperation当一个新的NSInvocationOperation对象创建时,它是用来运行指定的一个方法。你可能会想要使用这个对象,如果在你的应用中你想避免创建过多的自定义operation类。你正在添加或维护一个已经存在的应用,而它的类都已经定义好了,同时你不想修改NSOperation
如何编写多线程应用现在你已经知道一个好的多线程应用是怎样的,它是如何帮助你解决问题的,那么如何编写一个好的多线程应用呢?我会向你介绍iPhone应用中编写和处理多线程应用的主要技术。创建一个线程为了创建一个线程,你可以使用下面的方法:NSThreadPOSIX ThreadsNSObject 来创建一个新的线程NSOperation和NSOperationQueue我会逐一介绍他们,然后会举一些例
第一个例子这个例子演示了IO性能方面的一些问题。稍后我会通过多线程技术来加速代码的执行效率。我的例子很简单:在第一个测试中,我会在一个table view中加载和显示一序列图片。然后,我会向你演示滚动性能时的问题:你不能滚动表格直到当前状态的所有图片全部返回。在第二个测试中,我会使用多线程加速程序的执行。你会看到,当你在等待图片加载时,滚动性能将变得更好。注意:对于这两种情况,我的例子不会缓存图片
Copyright © 2005-2024 51CTO.COM 版权所有 京ICP证060544号