扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
public static void Regular() throws Exception {
站在用户的角度思考问题,与客户深入沟通,找到献县网站设计与献县网站推广的解决方案,凭借多年的经验,让设计与互联网技术结合,创造个性化、用户体验好的作品,建站类型包括:网站制作、成都做网站、企业官网、英文网站、手机端网站、网站推广、主机域名、虚拟空间、企业邮箱。业务覆盖献县地区。
File inputfile = new File("F:\\weka\\eucalyptus_Train.arff");
ArffLoader loader = new ArffLoader();
loader.setFile(inputfile);
Instances insTrain = loader.getDataSet();
insTrain.setClassIndex(insTrain.numAttributes()-1);
inputfile = new File("F:\\weka\\eucalyptus_Test.arff");
loader.setFile(inputfile);
Instances insTest = loader.getDataSet();
insTest.setClassIndex(insTest.numAttributes()-1);
double sum = insTest.numInstances();
int right = 0;
Classifier clas = new J48();
//Classifier clas = new weka.classifiers.bayes.BayesNet();
clas.buildClassifier(insTrain);
for(int i = 0; i sum; i++) {
if(clas.classifyInstance(insTest.instance(i)) == insTest.instance(i).classValue()) {
right++;
}
System.out.println(clas.classifyInstance(insTest.instance(i))+" : "+insTest.instance(i).classValue());
}
System.out.println("分类准确率:"+right/sum);
}
svm的话,要用一个wlsvm的包。 代码是一样的,就是Classifier class= new J48()这里要用svm的实例
算法思想:
将数列按有序化(递增或递减)排列,查找过程中采用跳跃式方式查找,即先以有序数列的中点位置为比较对象,如果要找的元素值小于该中点元素,则将待查序列缩小为左半部分,否则为右半部分。通过一次比较,将查找区间缩小一半。
折半查找是一种高效的查找方法。它可以明显减少比较次数,提高查找效率。但是,折半查找的先决条件是查找表中的数据元素必须有序。
算法步骤描述:
step1 首先确定整个查找区间的中间位置
mid = ( left + right )/ 2
step2 用待查关键字值与中间位置的关键字值进行比较;
若相等,则查找成功
若大于,则在后(右)半个区域继续进行折半查找
若小于,则在前(左)半个区域继续进行折半查找
Step3 对确定的缩小区域再按折半公式,重复上述步骤。最后,得到结果:要么查找成功, 要么查找失败。
折半查找的存储结构采用一维数组存放。
折半查找算法举例
对给定数列(有序),按折半查找算法,查找关键字值为30的数据元素。
折半查找的算法讨论:
优点: ASL≤log2n,即每经过一次比较,查找范围就缩小一半。经log2n 次计较就可以完成查找过程。
缺点:因要求有序,所以要求查找数列必须有序,而对所有数据元素按大小排序是非常费时的操作。另外,顺序存储结构的插入、删除操作不便利。
考虑:能否通过一次比较抛弃更多的部分(即经过一次比较,使查找范围缩得更小),以达到提高效率的目的。……?
可以考虑把两种方法(顺序查找和折半查找)结合起来,即取顺序查找简单和折半查找高效之所长,来达到提高效率的目的?实际上这就是分块查找的算法思想。
例如:[问题分析] 由于数据按升序排列,故用折半查找最快捷.
program binsearch;
const max=10;
var num:array[1..max] of integer;
i,n:integer;
procedure search(x,a,b:integer);
var mid:integer;
begin
if a=b then
if x=num[a] then writeln('Found:',a) else writeln('Number not found')
else begin
mid:=(a+b) div 2;
if xnum[mid] then search(x,mid,b);
if xnum[mid] then search(x,a,mid);
if x=num[mid] then writeln('Found:',mid);
end;
end;
begin
write('Please input 10 numbers in order:');
for i:=1 to max do read(num);
write('Please input the number to search:');
readln(n);
search(n,1,max);
end.
Java风格的代码举例:
//使用折半法进行查找
int getIndex(int[] nList, int nCount, int nCode) {
int nIndex = -1;
int jMin = 0;
int jMax = nCount - 1;
int jCur = (jMin+jMax)/2;
do
{
if(nList[jCur] nCode) {
jMax--;
} else if(nList[jCur] nCode) {
jMin++;
} else if(nList[jCur] == nCode) {
nIndex = jCur;
break;
}
jCur = (jMin + jMax)/2;
} while(jMin jMax);
return nIndex;
}
二分查找的性能说明
虽然二分查找的效率高,但是要将表按关键字排序。而排序本身是一种很费时的运算。既使采用高效率的排序方法也要花费 O(n lg n) 的时间。
二分查找只适用顺序存储结构。为保持表的有序性,在顺序结构里插入和删除都必须移动大量的结点。因此,二分查找特别适用于那种一经建立就很少改动、而又经常需要查找的线性表。
对那些查找少而又经常需要改动的线性表,可采用链表作存储结构,进行顺序查找。链表上无法实现二分查找
二分查找的C#实现代码:
using System;
using System.Collections.Generic;
using System.Text;
namespace BinschDemo
{
public class BinschDemo
{
public static int Binsch(int[] a, int key)
{
int low = 1;
int high = a.Length;
while (low = high)
{
int mid = (low + high) / 2;
if (key == a[mid])
{
return mid; //返回找到的索引值
}
else
{
if (key a[mid])
high = mid - 1;
else
low = mid + 1;
}
}
return -1; //查找失败
}
static void Main(string[] args)
{
Console.WriteLine("请输入10个递增数字: ");
int[] list = new int[10];
for (int i = 0; i 10; i++)
{
Console.Write("数字 : ", i);
list = Convert.ToInt32(Console.ReadLine());
}
Console.Write("请输入一个你要查找的数字:");
int find = Convert.ToInt32(Console.ReadLine());
int result = Binsch(list, find);
Console.WriteLine(result);
}
}
}
分块查找又索引查找,它主要用于“分块有序”表的查找。所谓“分块有序”是指将线性表L(一维数组)分成m个子表(要求每个子表的长度相等),且第i+1个子表中的每一个项目均大于第i个子表中的所有项目。“分块有序”表应该包括线性表L本身和分块的索引表A。因此,分块查找的关键在于建立索引表A。
(1)建立索引表A(二维数组)
索引表包括两部分:关键字项(子表中的最大值)和指针项(子表的第一项在线性表L中位置)
索引表按关键字有序的。
例如:线性表L(有序)为:1 2 3 4 5 6 7 8 9 10 11 12
分成m=3个子表:
索引表A:二维数组:第一列为每个子表的最大值 ,第二列为每个子表的起始地址
即: 4 0
8 4
12 8
(2)利用索引表A,确定待查项X所在的子表(块)。
(3)在所确定的子表中可以用“折半查找”法搜索待查项X;若找到则输出X;否则输出未找到信息。
n1和n2本身就指向两个完全不同的对象,因此其成员对象的地址不同也是很自然的
java转大数据是非常有优势的,如果想转入大数据开发领域,选择数仓开发是个捷径。千锋教育拥有线上免费Java线上公开课。如果特别想做更底层的开发,也可以选择从数仓开发切入,先接触,再曲线救国。那么数仓开发需要学啥? 1、会一门基础语言:java/python/scala:如果是java相关开发转大数据,那实在是太容易了,这一项就可以略过了。2、分布式存储及调度理论:hdfs、yarn的理论要理解且熟记,这些对于学习spark 或者hive 以及sql的优化是最最基础的知识。
3、sql 框架要会一个:spark sql/hive sql :如果对hive和spark都不懂的话,那就选择学spark,现在离线数仓越来越多的公司切spark了。Spark 相关主要学习spark core 和spark sql;要求sql要写的熟练,调优参数及原理,能懂一些源码就更好了。4、数仓建模、分层理论:这个是数仓的方法论,是一定要掌握的,理论都在《维度建模权威指南-kimball》这本书里,好书是好书,看起来比较枯燥,在看的时候多思考,结合自己正在做的业务,想象一下如果要为现在的业务划分主题该怎么划、业务矩阵该怎么设计等等,大胆想象就ok。5、其它需要了解:大数据相关的架构理论、olap、数据湖等等,知道越多越好,不需要太深入,主要作用是帮助理解大数据的那一套东西;网上的其它公司数仓的架构是啥样子,要知道架构里每个组件的作用是啥。还有一些其它的框架组件:kafka、presto、druid、flink 等了解,写个demo跑跑,知道流程就可。如果想了解更多相关知识,建议到千锋教育了解一下。千锋教育目前在18个城市拥有22个校区,年培养优质人才20000余人,与国内20000余家企业建立人才输送合作关系,院校合作超600所。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流