算法学习--printN

最近跟着中国大学慕课http://www.icourse163.org/learn/ZJU-93001?tid=1002261004学习数据结构,完全是新手,索性记录一下学习的内容和做过的题,方便回顾和整理。
**问题:给出一个数N,打印这N个数,并统计时间。
两种方法:1、for 循环打印;2、递归打印**

package com.yanan.course1_1;

/**
 * 测试打印N个数的不同方法及不同方法之间的区别
 * Created by 张亚南 on 2017/10/12.
 */

/**
 * 模板方法
 */
abstract class Template1 {
    abstract void printN(int n);

    protected void spendTime(int n) {
        long start = System.currentTimeMillis();
        this.printN(n);
        long end = System.currentTimeMillis();
        System.out.println("消耗时间是:" + (end - start));
    }
}

class PrintN3 extends Template1 {

    @Override
    void printN(int n) {
        for (int i = 0; i < n; i++) {
//            System.out.println(i);
        }
    }
}

class Print4 extends Template1 {

    @Override
    void printN(int n) {
        if (n > 0) {
            printN(n - 1);
//            System.out.println(n);
        }
    }
}

public class TestPrintN1 {
    public static void main(String[] args) {
        int n = 10000;
        //int n = 100000;//StackOverFlow
        new Print4().spendTime(n);
        new PrintN3().spendTime(n);
    }
}

打印结果是两个程序执行时间都是0,因为执行速度太快了。
把N设为N=100000(扩大一个数量级),结果递归打印方法StackOverFlow,说明空间不够。
所以想办法改变模板方法,让printN方法多执行几次。

package com.yanan.course1_1;

/**
 * 测试打印N个数的不同方法及不同方法之间的区别
 * Created by 张亚南 on 2017/10/12.
 */

/**
 * 模板方法
 */
abstract class Template1 {
    abstract void printN(int n);

    protected void spendTime(int n) {
        long start = System.currentTimeMillis();
        //多循环几次方法,扩大执行时间
        for (int i = 0; i < 1000; i++) {
            this.printN(n);
        }
        long end = System.currentTimeMillis();
        System.out.println("消耗时间是:" + (end - start));
    }
}

class PrintN3 extends Template1 {

    @Override
    void printN(int n) {
        for (int i = 0; i < n; i++) {
//            System.out.println(i);
        }
    }
}

class PrintN4 extends Template1 {

    @Override
    void printN(int n) {
        if (n > 0) {
            printN(n - 1);
//            System.out.println(n);
        }
    }
}

public class TestPrintN1 {
    public static void main(String[] args) {
        int n = 10000;
        new PrintN4().spendTime(n);
        new PrintN3().spendTime(n);
    }
}

这次执行完时间分别是
PrintN3:2;//循环
PrintN4:21;//递归
可见for循环的输出速度比较快。
总结:解决问题的效率和时间和空间的利用效率有关。

<think>嗯,用户想了解机器学习中的分类算法,包括它们的介绍、原理和实现。首先,我需要确定分类算法的基本定义,可能得参考之前提到的引用[1],里面提到分类算法是模式识别的一种,属于监督学习,对吧?然后要列举常见的算法,比如决策树、朴素贝叶斯这些,用户可能想知道每个算法的大致原理,比如逻辑回归和SVM的区别在哪里。 接下来,原理部分需要分点说明,每个算法的核心思想。比如决策树是基于树结构的,使用信息增益或基尼指数来分裂节点。而朴素贝叶斯则是基于贝叶斯定理,假设特征独立。这部分可能需要用数学公式,比如贝叶斯定理的表达式,但用户要求行内公式用$...$,所以得注意格式是否正确。 实现部分,用户可能希望看到代码示例,比如用Python的sklearn库展示逻辑回归或决策树的简单实现。这时候要确保代码正确,并且用中文注释。此外,引用中的reg:linear和multi:softmax可能和XGBoost的参数有关,但用户的问题是关于分类算法的一般介绍,所以可能需要提到不同算法在实现时的参数设置,比如逻辑回归中的solver选择,或者决策树的max_depth参数。 还要注意用户提到的生成相关问题,这部分需要根据内容提出相关的问题,比如分类算法的评估指标,或者数据预处理的方法。这些问题要自然,和前面的内容相关联。另外,引用标识要正确添加,比如在提到分类算法应用时引用[^1],在讨论多分类参数时引用[^2]。 最后,检查是否符合所有系统级指令:行内公式是否正确,独立公式是否用$$...$$,语言是否为中文,是否有相关问题,结构是否清晰。确保没有使用Markdown格式,代码块用三个反引号包裹,引用正确。可能需要调整部分内容,确保逻辑连贯,解释清楚每个算法的原理和实现步骤,同时保持回答真实可靠。</think>### 机器学习分类算法详解 #### 一、分类算法简介 分类算法是监督学习的核心任务之一,其目标是通过已知标签的训练数据构建模型,预测新数据的类别标签。例如,根据患者体检数据判断是否患病(二分类),或根据图像特征识别手写数字(多分类)。 #### 二、核心原理 1. **决策树** - 基于树形结构,通过递归选择最优特征进行数据划分 - 分裂标准:信息增益(ID3)、增益率(C4.5)、基尼指数(CART) - 终止条件:节点纯度达到阈值或样本量过少 2. **朴素贝叶斯** - 基于贝叶斯定理:$P(Y|X) = \frac{P(X|Y)P(Y)}{P(X)}$ - 特征条件独立假设:$P(x_1,x_2,...,x_n|Y) = \prod_{i=1}^n P(x_i|Y)$ - 适合文本分类等高维稀疏数据 3. **逻辑回归** - 使用Sigmoid函数将线性回归结果映射到$(0,1)$区间: $$P(Y=1|X) = \frac{1}{1+e^{-(w^Tx + b)}}$$ - 通过极大似然估计求解参数 4. **支持向量机(SVM)** - 寻找最大间隔超平面:$\min_{w,b} \frac{1}{2}\|w\|^2$ s.t. $y_i(w^Tx_i + b) \geq 1$ - 使用核技巧处理非线性可分问题 #### 三、算法实现(Python示例) ```python # 逻辑回归实现(Scikit-learn) from sklearn.linear_model import LogisticRegression from sklearn.datasets import load_iris # 加载数据 X, y = load_iris(return_X_y=True) # 创建模型(二分类示例) model = LogisticRegression(solver='lbfgs', max_iter=200) model.fit(X[:100], y[:100]) # 使用前两类数据 print(model.predict([[5.1, 3.5, 1.4, 0.2]])) # 输出预测类别 ``` ```python # 决策树实现(带预剪枝) from sklearn.tree import DecisionTreeClassifier dt_model = DecisionTreeClassifier( max_depth=3, # 最大树深 min_samples_split=10, # 节点最小样本数 criterion='gini' # 分裂标准 ) dt_model.fit(X, y) ``` #### 四、关键注意事项 1. **数据预处理**:标准化、缺失值处理、类别平衡(SMOTE过采样) 2. **评估指标**:准确率、精确率、召回率、F1-score、ROC-AUC 3. **多分类处理**: - "one-vs-rest"(OvR)策略 - 直接使用原生多分类算法(如设置`multi:softmax`参数)[^2]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值