一个有趣的算法题目

一天晚上(2018.3.28),老大根据业务需要在群里出了这么一个问题,题目是这样的:

考虑一个场景,有6个人为一个教练打分,最低一个星(1分),最高5个星(5分),六个人打完分之后,求一个平均分,问这个教练可能拿到的平均分有多少种情况

群里面一共有4个人,除了老大以外,还有后端小哥A,后端小哥B和我。然后我们分别给出了三种方法。

我的方法 -- 六重循环?

我给出了一个简单粗暴的方法,就是六重循环大法,大概长这个样子:

let average = [];
for(var f=1;f<6;f++){
    for(var a=1;a<6;a++){
        for(var b=1;b<6;b++){
            for(var c=1;c<6;c++){
                for(var d=1;d<6;d++){
                    for(var e=1;e<6;e++){
                        average.push((a+b+c+d+e+f)/6)
                    }
                }
            }
        }
    }
}
console.log(average.length)
console.log(new Set(average))

代码一贴到群里,群里沉默了一分钟,估计是在鄙视我。。。不过笨归笨,我算是给出了一个答案啊,紧接着后端小哥A在群里贴出了一段代码,证明了我答案的正确。

后端小哥A--递归法

上面的代码存在一个明显的问题,就是当人数变成7人的时候,你只能在循环里套一重循环,实现一个人数和平均分种数的函数才是更好的办法。下面是后端小哥A给出的函数,基本思路是递归,用GO实现的:
1016471-20180406185836744-105903867.png

我后来用js又实现了一下。

let averages = new Set();
function getAverage(people, total=0){
  if(people === 0){
    let aver = total/6;
    averages.add(aver);
    return;
  }
  for(let score = 1; score <=5 ; score++){
    getAverage(people-1, total+score)
  }
}
getAverage(6);
console.log(averages,averages.size);

这样,我们只需要改一个数字,就可以得到各种人数下的平均分种类,而不是像上面那样加循环了。然而客观上来说,这个算法还不算高明,尤其是跟后端小哥B的方法比起来

后端小哥B的方法--undefined法

之所以叫undefined法,是因为我也不知道起什么名字好,所以索性就叫undefined吧。同时也显出这个方法的高明,就像武林高手总喜欢隐姓埋名一样。这个方法的思路是这样的:

考虑平均分的情况就是考虑总分的情况,有多少种总分就有多少种平均分。总分最低时是每人打1分,最高时是每人打5分,也就是6-30,共25种情况,所以平均分也就有25种情况

所以说,算法好了,真的是可以为所欲为的。

转载于:https://www.cnblogs.com/imgss/p/8667146.html

### 关于TF-IDF算法的相关练习题 以下是几道与TF-IDF算法相关的经典题目,这些问题可以帮助深入理解和应用该算法: #### 题目1:计算给定文档集合中某个单词的TF-IDF值 假设有一个由三个文档组成的语料库: - 文档1:“机器学习是一门非常有趣的学科” - 文档2:“深度学习是机器学习的一个分支” - 文档3:“人工智能涵盖了机器学习和深度学习” 目标是计算单词“机器学习”的TF-IDF值。 提示:先分别计算每个文档中的TF值和整个语料库中的IDF值[^1]。 --- #### 题目2:手动实现TF-IDF算法 编写一段Python代码,用于计算一组文档中所有单词的TF-IDF值。输入是一个列表形式的文档集,输出是一个字典,键为单词,值为其对应的TF-IDF分数[^2]。 ```python from collections import Counter import math def compute_tf_idf(documents): tf_scores = [] idf_scores = {} # 计算TF for doc in documents: word_count = Counter(doc.split()) total_words = sum(word_count.values()) tf_doc = {word: count / total_words for word, count in word_count.items()} tf_scores.append(tf_doc) # 计算IDF num_docs = len(documents) all_words = set([word for doc in documents for word in doc.split()]) for word in all_words: df = sum(1 for doc in documents if word in doc.split()) idf_scores[word] = math.log(num_docs / (df + 1)) # 平滑处理 # 合并TF和IDF tfidf_scores = [{word: tf * idf_scores.get(word, 0) for word, tf in doc_tfs.items()} for doc_tfs in tf_scores] return tfidf_scores documents = ["机器 学习 是 一门 非常 有趣 的 学科", "深度 学习 是 机器 学习 的 一个 分支"] result = compute_tf_idf(documents) print(result) ``` --- #### 题目3:解释TF-IDF的作用及其应用场景 描述TF-IDF的核心思想,并列举至少三种实际应用场景。例如,在搜索引擎、推荐系统或情感分析等领域中是如何利用TF-IDF的? 答案要点:TF-IDF通过衡量单词的重要性来突出关键词[^3]。其常见应用场景包括但不限于: 1. **搜索引擎排名优化**:提高重要关键词的权重。 2. **文本分类**:帮助区分不同类别的文档特征。 3. **信息检索**:快速定位最相关的文档。 --- #### 题目4:比较词袋模型(BOW)与TF-IDF模型 阐述词袋模型(Bag of Words)和TF-IDF的主要区别,并讨论各自的优缺点[^4]。 答案要点: - BOW仅统计单词出现次数,忽略了单词的重要程度;而TF-IDF综合考虑了词频和逆文档频率。 - 缺点方面,BOW可能导致高频无意义词占据主导地位,而TF-IDF则能有效降低这类词的影响。 --- #### 题目5:解决过拟合问题 在使用SVM或其他复杂模型时,如果引入过多基于TF-IDF的特征可能会导致过拟合现象,请说明原因及解决方案。 答案要点:当特征维度过高时,训练数据不足以覆盖所有可能性,从而引发过拟合。可以通过降维技术(如PCA)、正则化手段或者减少特征数量等方式缓解此问题。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值