`
zhaoshijie
  • 浏览: 2259870 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

算法之高级算法

 
阅读更多
关键字:算法之高级算法

高级算法包括:动态规划,贪心算法

(1)动态规划

       动态规划算法是通过整合子问题来解决整个问题的,也就是说通过子问题的求解,可以得出次问题的解。

       动态规划关键是找出问题求解方程,即找到子问题和问题解的关系。


       例如:跳台阶问题
       题目:一个台阶总共有n 级,如果一次可以跳1 级,也可以跳2 级,求总共有多少总跳法。

       这是一道组合数学的题目,只要找到求解方程即可:

       f( n )= f( n-1 ) + f( n-2 )   并且 f(1)=1,f(2)=2

       方程含义是说     n个台阶的走法=最后走1级的走法+最后走两级的走法

       通过这个方程,可以很轻松的求解此问题,而这个问题就是典型的动态规划问题。



(2)贪心算法

       贪心算法不是对所有问题都能得到整体最优解,但对范围相当广泛的许多问题他能产生整体最优解或者是整体最优解的近似解。

       例如背包问题:与0-1背包问题类似,所不同的是在选择物品i装入背包时,可以选择物品i的一部分,而不一定要全部装入背包,1 <= i <= n。这2类问题都具有最优子结构性质,极为相似,但背包问题可以用贪心算法求解,而0-1背包问题却不能用贪心算法求解。

       基本步骤:

  1、算每种物品单位重量的价值Vi/Wi

  2、依贪心选择策略,将尽可能多的单位重量价值最高的物品装入背包

  3、若将这种物品全部装入背包后,背包内的物品总重量未超过C,则选择单位重量价值次高的物品并尽可能多的装入背包

  4、依此策略一直地进行下去,直到背包装满为止



(3)回溯算法

5、hash算法大全


package test.hash;

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.zip.CRC32;


/**
* Known hashing algorithms for locating a server for a key. Note that all hash
* algorithms return 64-bits of hash, but only the lower 32-bits are
* significant. This allows a positive 32-bit number to be returned for all
* cases.
*/
/**
* Hash算法核心类
* @author zhaoshijie
*
*/
@SuppressWarnings("unused")
public enum HashAlgorithm {//zsj

/**
* Native hash (String.hashCode()).
*/
NATIVE_HASH,
/**
* CRC32_HASH as used by the perl API. This will be more consistent both
* across multiple API users as well as java versions, but is mostly likely
* significantly slower.
*/
CRC32_HASH,
/**
* FNV hashes are designed to be fast while maintaining a low collision
* rate. The FNV speed allows one to quickly hash lots of data while
* maintaining a reasonable collision rate.
*
* @see http://www.isthe.com/chongo/tech/comp/fnv/
* @see http://en.wikipedia.org/wiki/Fowler_Noll_Vo_hash
*/
FNV1_64_HASH,
/**
* Variation of FNV.
*/
FNV1A_64_HASH,
/**
* 32-bit FNV1.
*/
FNV1_32_HASH,
/**
* 32-bit FNV1a.
*/
FNV1A_32_HASH,
/**
* MD5-based hash algorithm used by ketama.
*/
KETAMA_HASH,

/**
* mysql Hash算法
* From mysql source
*/
MYSQL_HASH,

ELF_HASH,

RS_HASH,

/**
* From lua source,it is used for long key
*/
LUA_HASH,

ELECTION_HASH,
/**
* The Jenkins One-at-a-time hash ,please see
* http://www.burtleburtle.net/bob/hash/doobs.html
*/
ONE_AT_A_TIME;

private static final long FNV_64_INIT = 0xcbf29ce484222325L;
private static final long FNV_64_PRIME = 0x100000001b3L;

private static final long FNV_32_INIT = 2166136261L;
private static final long FNV_32_PRIME = 16777619;

/**
* Compute the hash for the given key.
*
* @return a positive integer hash
*/
public long hash(final String k) {
long rv = 0;
switch (this) {
case NATIVE_HASH:
rv = k.hashCode();
break;
case CRC32_HASH:
// return (crc32(shift) >> 16) & 0x7fff;
CRC32 crc32 = new CRC32();
crc32.update(getBytes(k));
rv = crc32.getValue() >> 16 & 0x7fff;
break;
case FNV1_64_HASH: {
// Thanks to pierre@demartines.com for the pointer
rv = FNV_64_INIT;
int len = k.length();
for (int i = 0; i < len; i++) {
rv *= FNV_64_PRIME;
rv ^= k.charAt(i);
}
}
break;
case FNV1A_64_HASH: {
rv = FNV_64_INIT;
int len = k.length();
for (int i = 0; i < len; i++) {
rv ^= k.charAt(i);
rv *= FNV_64_PRIME;
}
}
break;
case FNV1_32_HASH: {
rv = FNV_32_INIT;
int len = k.length();
for (int i = 0; i < len; i++) {
rv *= FNV_32_PRIME;
rv ^= k.charAt(i);
}
}
break;
case FNV1A_32_HASH: {
rv = FNV_32_INIT;
int len = k.length();
for (int i = 0; i < len; i++) {
rv ^= k.charAt(i);
rv *= FNV_32_PRIME;
}
}
break;
case ELECTION_HASH:
case KETAMA_HASH:
byte[] bKey = computeMd5(k);
rv = (long) (bKey[3] & 0xFF) << 24 | (long) (bKey[2] & 0xFF) << 16
| (long) (bKey[1] & 0xFF) << 8 | bKey[0] & 0xFF;
break;

case MYSQL_HASH:
int nr2 = 4;
for (int i = 0; i < k.length(); i++) {
rv ^= ((rv & 63) + nr2) * k.charAt(i) + (rv <<;
nr2 += 3;
}
break;
case ELF_HASH:
long x = 0;
for (int i = 0; i < k.length(); i++) {
rv = (rv << 4) + k.charAt(i);
if ((x = rv & 0xF0000000L) != 0) {
rv ^= x >> 24;
rv &= ~x;
}
}
rv = rv & 0x7FFFFFFF;
break;
case RS_HASH:
long b = 378551;
long a = 63689;
for (int i = 0; i < k.length(); i++) {
rv = rv * a + k.charAt(i);
a *= b;
}
rv = rv & 0x7FFFFFFF;
break;
case LUA_HASH:
int step = (k.length() >> 5) + 1;
rv = k.length();
for (int len = k.length(); len >= step; len -= step) {
rv = rv ^ (rv << 5) + (rv >> 2) + k.charAt(len - 1);
}
case ONE_AT_A_TIME:
try {
int hash = 0;
for (byte bt : k.getBytes("utf-8")) {
hash += (bt & 0xFF);
hash += (hash << 10);
hash ^= (hash >>> 6);
}
hash += (hash << 3);
hash ^= (hash >>> 11);
hash += (hash << 15);
return hash;
} catch (UnsupportedEncodingException e) {
throw new IllegalStateException("Hash function error", e);
}
default:
assert false;
}

return rv & 0xffffffffL; /* Truncate to 32-bits */
}

private static ThreadLocal<MessageDigest> md5Local = new ThreadLocal<MessageDigest>();

/**
* Get the md5 of the given key.
*/
public static byte[] computeMd5(String k) {
MessageDigest md5 = md5Local.get();
if (md5 == null) {
try {
md5 = MessageDigest.getInstance("MD5");
md5Local.set(md5);
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException("MD5 not supported", e);
}
}
md5.reset();
md5.update(getBytes(k));
return md5.digest();
}

private static final byte[] getBytes(String k) {
if (k == null || k.length() == 0) {
throw new IllegalArgumentException("Key must not be blank");
}
try {
return k.getBytes("utf-8");
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
}

/**
* 测试算法性能
* @param alg:指定算法
*/
public static void test(HashAlgorithm alg){
long h=0;
long start=System.currentTimeMillis();
for(int i=0;i<100000;i++)//计算10万次
h=alg.hash("MYSQL_HASH");
System.out.println(System.currentTimeMillis()-start+"毫秒");
}

public static void main(String[] args) {

test(HashAlgorithm.CRC32_HASH);

//此乃传说中的  一致性hash
// test(HashAlgorithm.KETAMA_HASH);
}
}



package test.hash;

/**
* 各种Hash算法工具类
* @author zhaoshijie
*
*/
public class HashCodeUtils {

private HashAlgorithm hashAlgorighm;

/**
* 默认使用的算法
*/
public HashCodeUtils() {
this.hashAlgorighm = HashAlgorithm.CRC32_HASH;
}
/**
* 使用指定的算法
* @param hashAlgorighm
*/
public HashCodeUtils(HashAlgorithm hashAlgorighm) {
this.hashAlgorighm = hashAlgorighm;
}

/**
* 设置算法
* @param hashAlgorighm
*/
public final void setHashAlgorighm(HashAlgorithm hashAlgorighm) {
this.hashAlgorighm = hashAlgorighm;
}

public long hash(final String key) {
return this.hashAlgorighm.hash(key);
}

/**
* 取模运算(针对根据取模的算法,可以帮你计算某个Key应该放到哪里)
* @param size:几台服务器
* @param key:要计算的Key
* @return
*/
public final long getHash(int size, final String key) {
long hash = this.hashAlgorighm.hash(key);
return hash % size;
}

/**
* 测试方法
* @param args
*/
public static void main(String[] args) {
//此乃传说中的  一致性hash
HashCodeUtils util = new HashCodeUtils(HashAlgorithm.KETAMA_HASH);

//计算Hash
long hash = util.hash("testHash dd");

System.out.println(hash);

//取摸算法,看看此KEY应该放到10台服务器的那一台
long w = util.getHash(10, "testHash");
System.out.println(w);
long w2 = util.getHash(29, "testHash");
System.out.println(w2);
}

}




分享到:
评论

相关推荐

    漫画算法-小灰的算法之旅_漫画算法-小灰的算法之旅_算法_

    在算法的世界里,小灰的旅程涵盖了基础算法到高级算法的多个方面。书中的知识点可以分为以下几个部分: 1. **排序算法**:小灰可能会遇到如何整理物品的问题,书中会讲解各种排序算法,如冒泡排序、选择排序、插入...

    高级PID控制算法

    除了传统的PID控制方法,高级PID控制算法还包括了对传统PID控制功能的增强和扩展,例如,在一些现代的控制系统中,还可能包括滤波器、非线性控制逻辑以及适应性控制策略等,以应对更为复杂多变的工业环境。...

    高级算法实验代码及报告--近似算法

    在IT领域,高级算法是解决问题的关键工具,尤其在优化问题中。近似算法是一类重要的算法类型,它们在无法找到精确解或者精确解计算复杂度过高的情况下,提供一种可接受的接近最优解的策略。本资源包含了一系列高级...

    哈工大-高级算法设计与分析课程ppt-2020最新版

    《哈工大高级算法设计与分析课程PPT-2020最新版》是一份全面且深入探讨算法设计与分析的教育资源,源自知名的哈尔滨工业大学。这份资料涵盖了算法领域的多个核心主题,旨在帮助学习者理解并掌握解决复杂计算问题的...

    高级算法(algorithm)

    《高级算法》是一本深入探讨计算机科学中核心算法的教材,涵盖了广泛的算法主题,包括树、堆、队列、多队列、treap、随机数生成以及著名的八皇后问题等。这些算法是软件开发和数据处理的基础,对于任何希望在IT领域...

    高级算法KEY-ibm高级算法KEY-ibm

    高级算法KEY-ibm高级算法KEY-ibm高级算法KEY-ibm高级算法KEY-ibm

    算法与高级数据结构

    在IT领域,算法和高级数据结构是至关重要的基础,它们构成了计算机科学的基石。本主题主要涵盖了一系列常用且高效的数据结构以及相应的算法,这些都对软件开发和问题解决有着深远的影响。 首先,我们要理解什么是...

    麻省理工高级算法课件

    《麻省理工高级算法课件》是一份珍贵的教育资源,主要针对已经具备一定算法基础知识的学习者,旨在深化理解和提升在算法设计与分析方面的能力。这份资料来自世界知名的麻省理工学院(MIT),以其严谨的学术风格和...

    高级算法设计与分析

    高级算法设计与分析课程涉及的主要是计算机科学与技术领域的核心知识。本课程要求学生了解计算机应用中出现的各种常用算法,掌握评价这些算法的标准和方法,并且深入理解算法设计和分析的基本原理、方法和技巧。通过...

    南京大学软件学院高级算法PPT.rar

    《南京大学软件学院高级算法PPT》是一份珍贵的学习资源,专为软件学院的研究生们设计,涵盖了算法领域的深入知识。这份PPT旨在帮助学生掌握高级算法的核心概念、设计思想和实现技巧,对于提升编程能力,尤其是解决...

    高级算法设计.zip

    《高级算法设计》压缩包包含了哈工大深圳校区计算机硕士课程中的高级算法设计课件、教材《算法导论》以及相关的作业题目。这个资源对于深入理解算法和优化问题解决技巧非常有帮助。以下是对其中涉及的主要知识点的...

    高级算法课程作业homework1-10pdf版本

    在上述文档内容中,可以提炼出几个与高级算法课程相关的知识点。 首先,文档提到了解递归关系式的任务。具体而言,涉及到了如何解决递归式 ()=1/⋅((−1)+T(−)+−1),对于 =1 到 的求和问题。通过数学归纳法和...

    C++经典算法,高级程序员常用方法和技巧

    《C++经典算法,高级程序员常用方法和技巧》是一份针对C++编程的深度学习资料,旨在提升程序员在算法理解及高效编程方面的技能。这两本书的内容涵盖了C++编程的多个重要方面,对于想要深入理解C++语言并提高编程水平...

    哈尔滨工业大学《高级算法设计与分析》2019年期末试卷.pdf

    根据提供的标题、描述以及部分上下文内容来看,虽然“部分内容”并未给出实质性的考试题目或课程内容信息,但从标题和描述中我们可以提炼出关于“高级算法设计与分析”的相关知识点。 ### 高级算法设计与分析 ####...

    中科院高级算法习题

    中科院 高级算法 习题

    强烈推荐-美国MIT高级算法课件

    【MIT高级算法课件】是美国麻省理工学院(MIT)在2005年秋季开设的一门课程的讲义和资源集合,旨在深入探讨计算机科学中的基础算法和高级算法。这门课程对于想要提升算法设计与分析能力的IT专业人士来说,具有极高的...

    高级图像算法工程师的素质要求

    高级图像算法工程师的素质要求 作为一名高级图像算法工程师,需要具备以下几方面的知识和能力: 1. 学历要求:本科及以上学历,拥有机器视觉或图像处理方面的工作经验,硕士学历要求 8 年以上,博士学历要求 6 年...

    数学建模高级算法讲义

    数学建模中的高级算法涉及的几个重要知识点包括神经网络算法、遗传算法以及模拟退火算法。本讲义旨在简要介绍这些算法的原理和在数学建模中的应用。为了便于理解,我们将避免对算法的理论背景进行深入探讨,而是把...

    高级算法设计课件

    高级算法设计涉及了如何高效地处理复杂问题,优化计算资源的使用。在本课件中,你将深入理解算法的重要性,学习如何分析算法的时间复杂度和空间复杂度,这将帮助你评估算法的效率并选择最优解。 **遗传算法** 遗传...

Global site tag (gtag.js) - Google Analytics