今天给各位分享java分类算法的知识,其中也会对最简单的分类算法进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
1、Java 排序算法(选择、冒泡)等等2、Java实现通用组合算法3、Java算法4、JAVA 二分算法只能对数字进行查找吗5、java二分搜索算法怎样实现?6、java中哪些可以涉及算法
Java 排序算法(选择、冒泡)等等
//选择排序
publicstaticvoidselectionSort(int[] elements){
for(inti = 0; i elements.length-1; ++i){
intk = i;
for(intj = i; j elements.length; ++j){
if(elements[k] elements[j]){
k = j;
}
}
if(k != i){//交换元素
inttemp = elements[i];
elements[i] = elements[k];
elements[k] = temp;
}
} }
//冒泡排序
static void bubblesort(int[] a){
int temp;
for(int i=0; ia.length;++i){
for(int j=a.length-1;ji;–j){
if(a[j] a[j-1]){
temp = a[j];
a[j] = a[j-1];
a[j-1] = temp;
}
}
}
}
楼上说的没错,你得自己去学会解决问题。好好加油吧…
Java实现通用组合算法
Java实现通用组合算法 存在一个类似{ }这样的集合 经过 取 组合 其他位置用非字母数字字符替代 比如使用*号 得到类似{ *** *** }这样的集合
现在有这样的需求
存在一个类似{ }这样的集合 经过 取 组合 其他位置用非字母数字字符替代 比如使用*号 得到类似{ *** *** }这样的集合
还要求对于{ *** *** }这样的集合 再次经过 取 组合 其他位置用非字母数字字符替代 比如使用*号 得到类似{***** ***** *** * * }这样的集合
对于这样的要求 实现的思路如下
首先 主要思想是基于信息编码原理 通过扫描字符串 将 组合变为 组合
其次 对于每个数字字符串 设置一个单线程 在单线程类中设置一个List用来存放待处理数字字符串(可能含有*号 或者不含有)中每个数字的(而非*号)索引位置值
再次 设置BitSet来标志每个位置是否被*号替换得到新的组合字符串
最后 在扫描原始待处理数字字符串的过程中 根据设置的字符列表List中索引 来操作BitSet 对于每一个BitSet得到一个新的组合
使用Java语言实现如下
package shirdrn;import java util ArrayList;import java util BitSet;import java util Collection;import java util Collections;import java util HashSet;import java util Iterator;import java util List;/*** 通用组合拆分类(基于单线程)* 可以完成两种功能 * 第一 可以将完全数字串拆分成为含有*号的字符串 * 例如 输入集合{ } Splitter类会遍历该集合 对每个字符串 创建一个SplitterThread* 线程来处理 如果是 取 组合 即starCount= = 经过线程处理得到类似****** ***** * 等结果* 第二 根据从带有*号的字符串经过拆分过滤后得到的字符串集合 对其中每一个字符串进行组合* 例如 输入集合 取 组合字符串集合{ *** *** }* CommonSplitter类会遍历该集合 对每个带有*号的字符串 创建一个SplitterThread* 线程来处理 如果是 串 组合 即starCount= = 经过线程处理得到类似****** ***** * 等结果* @author 时延军*/public class CommonSplitter {private int starCount;private boolean duplicate;private Collection filteredContainer;public Collection getFilteredContainer() {return filteredContainer;}/*** 构造一个Spilitter实例* @param container 输入的待处理字符串集合* @param starCount 如果对于长度为N的数字字符串 进行M组合(即N取M) 则starCount=N M* @param duplicate 是否去重*/public CommonSplitter(Collection container int starCount boolean duplicate) {this duplicate = duplicate;this starCount = starCount;if(this duplicate) { // 根据指定是否去重的选择 选择创建容器filteredContainer = Collections synchronizedSet(new HashSet());}else {filteredContainer = Collections synchronizedList(new ArrayList());}Iterator it = erator();while(it hasNext()) {new Thread(new SplitterThread(it next() trim())) start();}try {Thread sleep( );} catch (InterruptedException e) {e printStackTrace();}}/*** 对一个指定的N场比赛的长度为N的单式投注字符串进行组合* 输入单式投注注字符串string 例如 组合得到类似****** ***** * 结果的集合** @author 时延军*/class SplitterThread implements Runnable {private char[] charArray;private int len; // 数字字符的个数List occupyIndexList = new ArrayList(); // 统计字符串中没有带*的位置的索引private List container = new ArrayList();private BitSet startBitSet; // 比特集合起始状态private BitSet endBitSet; // 比特集合终止状态 用来控制循环public SplitterThread(String string) {this charArray = string toCharArray();this len = string replace( * ) length();this startBitSet = new BitSet(len);this endBitSet = new BitSet(len);// 初始化startBitSet 左侧占满*符号int count = ; //for (int i= ; iif(charArray[i] != * ) {if(count starCount) {this startBitSet set(i true);count++;}occupyIndexList add(i);}}// 初始化endBit 右侧占满*符号count = ;for (int i = string length() ; i ; i ) {if(charArray[i] != * ) {if(count starCount) {this endBitSet set(i true);count++;}ccupyIndexList add(i);}}// 根据起始startBitSet 构造带*的组合字符串并加入容器char[] charArrayClone = this charArray clone();for (int i= ; iif (this startBitSet get(i)) {charArrayClone[i] = * ;}}ntainer add(new String(charArrayClone));}public void run() {this split();synchronized(filteredContainer) {filteredContainer addAll(ntainer);}}public void split() {while(!this startBitSet equals(this endBitSet)) {int zeroCount = ; // 统计遇到 后 左边 的个数int oneCount = ; // 统计遇到 后 左边 的个数int pos = ; // 记录当前遇到 的索引位置char[] charArrayClone = this charArray clone();// 遍历startBitSet来确定 出现的位置for (int i= ; iif (!this startBitSet get(this occupyIndexList get(i))) {zeroCount++;}if (this startBitSet get(this occupyIndexList get(i)) !this startBitSet get(this occupyIndexList get(i+ ))) {pos = i;oneCount = i zeroCount;// 将 变为 this startBitSet set(this occupyIndexList get(i) false);this startBitSet set(this occupyIndexList get(i+ ) true);break;}}// 将遇到 后 左侧的 全部移动到最左侧int count = Math min(zeroCount oneCount);int startIndex = this occupyIndexList get( );int endIndex = ;if(pos count ) {pos ;endIndex = this occupyIndexList get(pos);for (int i= ; ithis startBitSet set(startIndex true);this startBitSet set(endIndex false);startIndex = this occupyIndexList get(i+ );pos ;if(pos ) {endIndex = this occupyIndexList get(pos);}}}// 将遇到 的位置用*替换for (int i= ; iif (this startBitSet get(this occupyIndexList get(i))) {charArrayClone[this occupyIndexList get(i)] = * ;}}ntainer add(new String(charArrayClone));}}}}
测试用例如下所示
package shirdrn;import java util ArrayList;import java util Collection;import junit framework TestCase;import shirdrn util GoodTools;public class TestCommonSplitter extends TestCase {private CommonSplitter splitter;public void setSplitter(Collection container int starCount boolean duplicate) {this splitter = new CommonSplitter(container starCount duplicate);}public void testSplliter() {Collection container = new ArrayList();container add( * ** );int starCount = ;boolean duplicate = true;this setSplitter(container starCount duplicate);System out println(this splitter getFilteredContainer());}public void testSplliter () {Collection container = new ArrayList();container add( * * * );int starCount = ;boolean duplicate = true;this setSplitter(container starCount duplicate);System out println(this splitter getFilteredContainer());assertEquals( this splitter getFilteredContainer() size());}public void testNoStar() {Collection container = new ArrayList();container add( );int starCount = ;boolean duplicate = true;this setSplitter(container starCount duplicate);System out println(this splitter getFilteredContainer());assertEquals( this splitter getFilteredContainer() size());}public void testSplitter_ _ () {// 场: String multiSeq = ;Collection container = GoodTools getNSingleList(multiSeq);assertEquals( container size());int starCount = ;boolean duplicate = false;this setSplitter(container starCount duplicate);assertEquals( this splitter getFilteredContainer() size());}}上述测试耗时大约 s左右
上述算法实现主要是针对两种条件进行实现的 即
第一个是完全数字字符串 —— 带有*号的组合数字字符串
第二个带有*号的组合数字字符串 —— 在该基础上继续组合得到带有*号的组合数字字符串
lishixinzhi/Article/program/Java/hx/201311/25538
Java算法
int t;//声明变量
t=a;//将a赋值给t
a=b;//将b赋值给a
b=t;//再将t赋值给b
最终结果是将a和b中的值进行了一次交换,t是中间变量,主要作用是辅助交换操作。这个算法在做冒泡排序的时候会经常用到!
JAVA 二分算法只能对数字进行查找吗
2分法查找,前提是要有序,要排序,必然要比较大小,所以只要一个类它实现了Comparable接口的compareTo(T o)方法(Comparable在java.lang包中)或是实现一个比较器对象接口Comparator(Comparator在java.util包),都可以进行比较了。不管是String型,计本数据类型,还是其他什么的,都可以用2分发查找了。给你看看API
java.util.Collections中2分法的API
binarySearch
public static T int binarySearch(List? extends Comparable? super T list,
T key)使用二分搜索法搜索指定列表,以获得指定对象。在进行此调用之前,必须根据列表元素的自然顺序对列表进行升序排序(通过 sort(List) 方法)。如果没有对列表进行排序,则结果是不确定的。如果列表包含多个等于指定对象的元素,则无法保证找到的是哪一个。
此方法对“随机访问”列表运行 log(n) 次(它提供接近固定时间的位置访问)。如果指定列表没有实现 RandomAccess 接口并且是一个大型列表,则此方法将执行基于迭代器的二分搜索,执行 O(n) 次链接遍历和 O(log n) 次元素比较。
参数:
list – 要搜索的列表。
key – 要搜索的键。
返回:
如果搜索键包含在列表中,则返回搜索键的索引;否则返回 (-(插入点) – 1)。插入点 被定义为将键插入列表的那一点:即第一个大于此键的元素索引;如果列表中的所有元素都小于指定的键,则为 list.size()。注意,这保证了当且仅当此键被找到时,返回的值将 = 0。
抛出:
ClassCastException – 如果列表中包含不可相互比较 的元素(例如,字符串和整数),或者搜索键无法与列表的元素进行相互比较。
——————————————————————————–
binarySearch
public static T int binarySearch(List? extends T list,
T key,
Comparator? super T c)使用二分搜索法搜索指定列表,以获得指定对象。在进行此调用之前,必须根据指定的比较器对列表进行升序排序(通过 sort(List, Comparator) 方法)。如果没有对列表进行排序,则结果是不确定的。如果列表包含多个等于指定对象的元素,则无法保证找到的是哪一个。
此方法对“随机访问”的列表运行 log(n) 次(它提供接近固定时间的位置访问)。如果指定列表没有实现 RandomAccess 接口并且是一个大型列表,则此方法将执行基于迭代器的二分搜索,执行 O(n) 次链接遍历和 O(log n) 次元素比较。
参数:
list – 要搜索的列表。
key – 要搜索的键。
c – 排序列表的比较器。null 值指示应该使用元素的自然顺序。
返回:
如果搜索键包含在列表中,则返回搜索键的索引;否则返回 (-(插入点) – 1)。插入点 被定义为将键插入列表的那一点:即第一个大于此键的元素索引;如果列表中的所有元素都小于指定的键,则为 list.size()。注意,这保证了当且仅当此键被找到时,返回的值将 = 0。
抛出:
ClassCastException – 如果列表中包含使用指定的比较器不可相互比较 的元素,或者使用此比较器无法相互比较搜索键与列表元素。
java.util.Comparator接口。
A int compare(T o1,T o2)比较用来排序的两个参数。根据第一个参数小于、等于或大于第二个参数分别返回负整数、零或正整数。
在前面的描述中,符号 sgn(expression) 表示 signum 数学函数,根据 expression 的值为负数、0 还是正数,该函数分别返回 -1、0 或 1。
实现程序必须确保对于所有的 x 和 y 而言,都存在 sgn(compare(x, y)) == -sgn(compare(y, x))。(这意味着当且仅当 compare(y, x) 抛出异常时 compare(x, y) 才必须抛出异常。)
实现程序还必须确保关系是可传递的:((compare(x, y)0) (compare(y, z)0)) 意味着 compare(x, z)0。
最后,实现程序必须确保 compare(x, y)==0 意味着对于所有的 z 而言,都存在 sgn(compare(x, z))==sgn(compare(y, z))。
虽然这种情况很普遍,但并不 严格要求 (compare(x, y)==0) == (x.equals(y))。一般说来,任何违背这个条件的 Comparator 都应该清楚地指出这一事实。推荐的语言是“注意:此 Comparator 强行进行与 equals 不一致的排序。”
参数:
o1 – 要比较的第一个对象。
o2 – 要比较的第二个对象。
返回:
根据第一个参数小于、等于或大于第二个参数分别返回负整数、零或正整数。
抛出:
ClassCastException – 如果参数的类型不允许此 Comparator 对它们进行比较。
B boolean equals(Object obj)指示某个其他对象是否“等于”此 Comparator。此方法必须遵守 Object.equals(Object) 的常规协定。此外,仅当 指定的对象也是一个 Comparator,并且强行实施与此 Comparator 相同的排序时,此方法才返回 true。因此,comp1.equals(comp2) 意味着对于每个对象引用 o1 和 o2 而言,都存在 sgn(comp1.compare(o1, o2))==sgn(comp2.compare(o1, o2))。
注意,不 重写 Object.equals(Object) 方法总是 安全的。然而,在某些情况下,重写此方法可以允许程序确定两个不同的 Comparator 是否强行实施了相同的排序,从而提高性能。
覆盖:
类 Object 中的 equals
参数:
obj – 要进行比较的引用对象。
返回:
仅当指定的对象也是一个 Comparator,并且强行实施与此 Comparator 相同的排序时才返回 true。
以及java.lang.Comparable
public interface ComparableT此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的 compareTo 方法被称为它的自然比较方法。
实现此接口的对象列表(和数组)可以通过 Collections.sort(和 Arrays.sort)进行自动排序。实现此接口的对象可以用作有序映射中的键或有序集合中的元素,无需指定比较器。
对于类 C 的每一个 e1 和 e2 来说,当且仅当 e1.compareTo(e2) == 0 与 e1.equals(e2) 具有相同的 boolean 值时,类 C 的自然排序才叫做与 equals 一致。注意,null 不是任何类的实例,即使 e.equals(null) 返回 false,e.compareTo(null) 也将抛出 NullPointerException。
建议(虽然不是必需的)最好使自然排序与 equals 一致。这是因为在使用自然排序与 equals 不一致的元素(或键)时,没有显式比较器的有序集合(和有序映射表)行为表现“怪异”。尤其是,这样的有序集合(或有序映射表)违背了根据 equals 方法定义的集合(或映射表)的常规协定。
例如,如果将两个键 a 和 b 添加到没有使用显式比较器的有序集合中,使 (!a.equals(b) a.compareTo(b) == 0),那么第二个 add 操作将返回 false(有序集合的大小没有增加),因为从有序集合的角度来看,a 和 b 是相等的。
实际上,所有实现 Comparable 的 Java 核心类都具有与 equals 一致的自然排序。java.math.BigDecimal 是个例外,它的自然排序将值相等但精确度不同的 BigDecimal 对象(比如 4.0 和 4.00)视为相等。
从数学上讲,定义给定类 C 上自然排序的关系式 如下:
{(x, y)|x.compareTo(y) = 0}。
整体排序的商 是:
{(x, y)|x.compareTo(y) == 0}。
它直接遵循 compareTo 的协定,商是 C 的等价关系,自然排序是 C 的整体排序。当说到类的自然排序与 equals 一致 时,是指自然排序的商是由类的 equals(Object) 方法定义的等价关系。
{(x, y)|x.equals(y)}。
compareTo
int compareTo(T o)比较此对象与指定对象的顺序。如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。
实现类必须确保对于所有的 x 和 y 都存在 sgn(x.compareTo(y)) == -sgn(y.compareTo(x)) 的关系。(这意味着如果 y.compareTo(x) 抛出一个异常,则 x.compareTo(y) 也要抛出一个异常。)
实现类还必须确保关系是可传递的:(x.compareTo(y)0 y.compareTo(z)0) 意味着 x.compareTo(z)0。
最后,实现者必须确保 x.compareTo(y)==0 意味着对于所有的 z,都存在 sgn(x.compareTo(z)) == sgn(y.compareTo(z))。 强烈推荐 (x.compareTo(y)==0) == (x.equals(y)) 这种做法,但并不是 严格要求这样做。一般来说,任何实现 Comparable 接口和违背此条件的类都应该清楚地指出这一事实。推荐如此阐述:“注意:此类具有与 equals 不一致的自然排序。”
在前面的描述中,符号 sgn(expression) 指定 signum 数学函数,该函数根据 expression 的值是负数、零还是正数,分别返回 -1、0 或 1 中的一个值。
参数:
o – 要比较的对象。
返回:
负整数、零或正整数,根据此对象是小于、等于还是大于指定对象。
抛出:
ClassCastException – 如果指定对象的类型不允许它与此对象进行比较。
java二分搜索算法怎样实现?
应该要用递归方法吧? binarySearch()方法应该要带四个参数(数组,要查找的数值,查找范围的最左边下标,查找范围的最右边下标)。然后就利用递归方法在 if (x a[middle]) 和 else 后面通过修改查找范围自调用binarySearch()方法;
java中哪些可以涉及算法
个人理解算法就是计算的方法,从1+1到矩阵啥的都算吧,java中冒泡排序就是一类算法,有多种算法可以达到冒泡的目的,高大上的有各种加密算法,其实算法感觉挺多的,其实你对电脑进行的操作在内存中就进行了很多的逻辑运算
java分类算法的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于最简单的分类算法、java分类算法的信息别忘了在本站进行查找喔。