牛客网算法八股刷题系列K-Means真题描述

Posted 静静的喝酒

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了牛客网算法八股刷题系列K-Means真题描述相关的知识,希望对你有一定的参考价值。

牛客网算法八股刷题系列——K-Means真题描述

题目描述

两个种子点 A ( − 1 , 1 ) , B ( 2 , 1 ) A(-1,1),B(2,1) A(1,1),B(2,1),其余样本点 ( 0 , 0 ) , ( 0 , 2 ) , ( 1 , 1 ) , ( 3 , 2 ) , ( 6 , 0 ) , ( 6 , 2 ) (0,0),(0,2),(1,1),(3,2),(6,0),(6,2) (0,0),(0,2),(1,1),(3,2),(6,0),(6,2)。利用 K-Means \\textK-Means K-Means算法,点群中心按坐标平均计算。最终:

  • 种子点 A A A需要移动的次数;
  • 种子点 B B B需要移动的次数;
  • 属于种子点 A A A样本点数(不含 A A A);
  • 属于种子点 B B B样本点数(不含 B B B);

分别是 ( ) (\\quad) ()

A 2 , 2 , 3 , 3 \\mathcal A \\quad 2,2,3,3 A2,2,3,3
B 1 , 1 , 3 , 3 \\mathcal B \\quad 1,1,3,3 B1,1,3,3
C 1 , 1 , 2 , 4 \\mathcal C \\quad 1,1,2,4 C1,1,2,4
D 2 , 2 , 2 , 4 \\mathcal D \\quad 2,2,2,4 D2,2,2,4

正确答案: A \\mathcal A A

题目解析

初始状态下,上述样本点(蓝色点)与种子点(橙色点)之间的位置关系表示如下:

针对种子点 A , B \\mathcal A,\\mathcal B A,B,分别求出各自对应其他样本点的距离:

  • 这里以‘欧式距离’计算点之间的距离信息,以 A A A与样本点 a 1 : ( 0 , 0 ) a_1:(0,0) a1:(0,0)之间距离为例,后续同理:
    Dist A ⇔ a 1 = ( − 1 − 0 ) 2 + ( 1 − 0 ) 2 = 2 \\textDist_A \\Leftrightarrow a_1 = \\sqrt(-1 -0)^2 + (1 - 0)^2 = \\sqrt2 DistAa1=(10)2+(10)2 =2
  • 由于计算过程中不包含 A , B A,B A,B点,这里直接将它们视作‘虚拟样本’
SamplePoint/InitialCenter \\textSamplePoint/InitialCenter SamplePoint/InitialCenter A A A B B B ClusterResult \\textClusterResult ClusterResult
a 1 : ( 0 , 0 ) a_1:(0,0) a1:(0,0) 2 \\sqrt2 2 3 \\sqrt3 3 A A A
a 2 : ( 0 , 2 ) a_2:(0,2) a2:(0,2) 2 \\sqrt2 2 5 \\sqrt5 5 A A A
a 3 : ( 1 , 1 ) a_3:(1,1) a3:(1,1) 2 2 2 1 1 1 B B B
a 4 : ( 3 , 2 ) a_4:(3,2) a4:(3,2) 17 \\sqrt17 17 2 \\sqrt2 2 B B B
a 5 : ( 6 , 0 ) a_5:(6,0) a5:(6,0) 50 \\sqrt50 50 17 \\sqrt17 17 B B B
a 6 : ( 6 , 2 ) a_6:(6,2) a6:(6,2) 50 \\sqrt50 50 17 \\sqrt17 17 B B B

至此,能够得到距离种子点 A A A近的样本点集合 A n e a r A_near Anear和距离种子点 B B B近的样本点集合 B n e a r B_near Bnear
A n e a r : a 1 , a 2 B n e a r : a 3 , a 4 , a 5 , a 6 \\begincases A_near: \\a_1,a_2\\ \\\\ B_near: \\a_3,a_4,a_5,a_6\\ \\endcases Anear:a1,a2Bnear:a

还在担心面试不通过吗?给大家推荐一个超级好用的刷面试题神器:牛客网,里面涵盖了各个领域的面试题库,还有大厂真题哦!

赶快悄悄的努力起来吧,不苒在这里衷心祝愿各位大佬都能顺利通过面试。
面试专栏分享,感觉有用的小伙伴可以点个订阅,不定时更新相关面试题:面试专栏

文章目录

🍉正文

1.说一说JS数据类型有哪些,区别是什么?

JS数据类型分为两类:一类是基本数据类型,也叫简单数据类型,包含7种类型,分别是Number 、String、Boolean、BigInt、Symbol、Null、Undefined。
另一类是引用数据类型也叫复杂数据类型,通常用Object代表,普通对象,数组,正则,日期,Math数学函数都属于Object。
数据分成两大类的本质区别:基本数据类型和引用数据类型它们在内存中的存储方式不同。
基本数据类型是直接存储在栈中的简单数据段,占据空间小,属于被频繁使用的数据。
引用数据类型是存储在堆内存中,占据空间大。引用数据类型在栈中存储了指针,该指针指向堆中该实体的起始地址,当解释器寻找引用值时,会检索其在栈中的地址,取得地址后从堆中获得实体。

2.说一说JS变量提升?

标准回答:变量提升是指JS的变量和函数声明会在代码编译期,提升到代码的最前面。 变量提升成立的前提是使用Var关键字进行声明的变量,并且变量提升的时候只有声明被提升,赋值并不会被提升,同时函数的声明提升会比变量的提升优先。 变量提升的结果,可以在变量初始化之前访问该变量,返回的是undefined。在函数声明前可以调用该函数。
加分回答:使用let和const声明的变量是创建提升,形成暂时性死区,在初始化之前访问let和const创建的变量会报错。

3.说一说map 和 forEach 的区别?

标准回答 :
map 和 forEach 的区别:map有返回值,可以开辟新空间,return出来一个length和原数组一致的数组,即便数组元素是undefined或者是null。forEach默认无返回值,返回结果为undefined,可以通过在函数体内部使用索引修改数组元素。
加分回答:
map的处理速度比forEach快,而且返回一个新的数组,方便链式调用其他数组新方法,比如filter、reduce let arr = [1, 2, 3, 4, 5]; let arr2 = arr.map(value => value * value).filter(value => value > 10); // arr2 = [16, 25]

4.说几个未知宽高元素水平垂直居中方法

未知宽高元素水平垂直都居中的实现方法:

  1. 设置元素相对父级定位position:absolute;left:50%;right:50%,让自身平移自身高度50% transform: translate(-50%,-50%);,这种方式兼容性好,被广泛使用的一种方式
  2. 设置元素的父级为弹性盒子display:flex,设置父级和盒子内部子元素水平垂直都居中justify-content:center; align-items:center ,这种方式代码简洁,但是兼容性ie 11以上支持,由于目前ie版本都已经很高,很多网站现在也使用这种方式实现水平垂直居中
  3. 设置元素的父级为网格元素display: grid,设置父级和盒子内部子元素水平垂直都居中justify-content:center; align-items:center ,这种方式代码简介,但是兼容性ie 10以上支持
  4. 设置元素的父级为表格元素display: table-cell,其内部元素水平垂直都居中text-align: center;vertical-align: middle; ,设置子元素为行内块display: inline-block; ,这种方式兼容性较好

5.说一说new会发生什么?

new 关键字会进行如下的操作:

  1. 创建一个空的简单JavaScript对象(即);
  2. 为步骤1新创建的对象添加属性__proto__,将该属性链接至构造函数的原型对象 ;
  3. 将步骤1新创建的对象作为this的上下文 ;
  4. 如果该函数没有返回对象,则返回this

6.说一说伪数组和数组的区别?

标准回答:
伪数组它的类型不是Array,而是Object,而数组类型是Array。可以使用的length属性查看长度,也可以使用[index]获取某个元素,但是不能使用数组的其他方法,也不能改变长度,遍历使用for in方法。
伪数组的常见场景: -函数的参数arguments -原生js获取DOM:document.querySelector(‘div’) 等 -jquery获取DOM:$(“div”)等

加分回答:
伪数组转换成真数组方法 -Array.prototype.slice.call(伪数组) -[].slice.call(伪数组) -Array.from(伪数组) 转换后的数组长度由 length 属性决定。索引不连续时转换结果是连续的,会自动补位。

7.说一下fetch 请求方式?

fetch是一种HTTP数据请求的方式,是XMLHttpRequest的一种替代方案。Fetch函数就是原生js,没有使用XMLHttpRequest对象。fetch()方法返回一个Promise解析Response来自Request显示状态(成功与否)的方法。
加分回答:
XMLHttpRequest的问题 -所有的功能全部集中在一个对象上, 容易书写出混乱而且不容易维护的代码 -采用传统的事件驱动模式, 无法适配新的 Promise API Fetch API的特点 -精细的功能分割: 头部信息, 请求信息, 响应信息等均分布到不同的对象, 更利于处理各种复杂的数据交互场景 -使用Promise API, 更利于异步代码的书写 -同源请求也可以自定义不带 cookie,某些服务不需要 cookie 场景下能少些流量

8.说一下有什么方法可以保持前后端实时通信?

保持前后端实时通信的方法有以下几种:

  • 轮询是客户端和服务器之间会一直进行连接,每隔一段时间就询问一次。其缺点也很明显:连接数会很多,一个接受,一个发送。而且每次发送请求都会有Http的Header,会很耗流量,也会消耗CPU的利用率。优点就是实现简单,无需做过多的更改。缺点是轮询的间隔过长,会导致用户不能及时接收到更新的数据;轮询的间隔过短,会导致查询请求过多,增加服务器端的负担
  • 长轮询是对轮询的改进版,客户端发送HTTP给服务器之后,如果没有新消息,就一直等待。有新消息,才会返回给客户端。在某种程度上减小了网络带宽和CPU利用率等问题。由于http数据包的头部数据量往往很大(通常有400多个字节),但是真正被服务器需要的数据却很少(有时只有10个字节左右),这样的数据包在网络上周期性的传输,难免对网络带宽是一种浪费。优点是做了优化,有较好的时效性。缺点是保持连接会消耗资源; 服务器没有返回有效数据,程序超时。
  • iframe流方式是在页面中插入一个隐藏的iframe,利用其src属性在服务器和客户端之间创建一条长连接,服务器向iframe传输数据(通常是HTML,内有负责插入信息的javascript),来实时更新页面。优点是消息能够实时到达;浏览器兼容好。缺点是服务器维护一个长连接会增加开销;IE、chrome、Firefox会显示加载没有完成,图标会不停旋转。
  • WebSocket是类似Socket的TCP长连接的通讯模式,一旦WebSocket连接建立后,后续数据都以帧序列的形式传输。在客户端断开WebSocket连接或Server端断掉连接前,不需要客户端和服务端重新发起连接请求。在海量并发和客户端与服务器交互负载流量大的情况下,极大的节省了网络带宽资源的消耗,有明显的性能优势,且客户端发送和接受消息是在同一个持久连接上发起,实时性优势明显。缺点是浏览器支持程度不一致,不支持断开重连。
  • SSE(Server-Sent Event)是建立在浏览器与服务器之间的通信渠道,然后服务器向浏览器推送信息。SSE 是单向通道,只能服务器向浏览器发送,因为 streaming 本质上就是下载。 优点是SSE 使用 HTTP 协议,现有的服务器软件都支持。SSE 属于轻量级,使用简单;SSE 默认支持断线重连;
    轮询适用于:小型应用,实时性不高 长轮询适用于:一些早期的对及时性有一些要求的应用:web IM 聊天 iframe适用于:客服通信等 WebSocket适用于:微信、网络互动游戏等 SSE适用于:金融股票数据、看板等

9.说一说vue-router 实现懒加载的方法?

vue-router 实现懒加载的方法有两种:

  • ES6的impot方式:
component: () => import(/* webpackChunkName: "about" */ '../views/About.vue')
  • VUE中的异步组件进行懒加载方式:
 component: resolve=>(require(['../views/About'],resolve))

10.说一说axios的拦截器原理及应用?

axios的拦截器的应用场景: 请求拦截器用于在接口请求之前做的处理,比如为每个请求带上相应的参数(token,时间戳等)。 返回拦截器用于在接口返回之后做的处理,比如对返回的状态进行判断(token是否过期)。
xios为开发者提供了这样一个API:拦截器。拦截器分为 请求(request)拦截器和 响应(response)拦截器。
拦截器原理:创建一个chn数组,数组中保存了拦截器相应方法以及dispatchRequest(dispatchRequest这个函数调用才会真正的开始下发请求),把请求拦截器的方法放到chn数组中dispatchRequest的前面,把响应拦截器的方法放到chn数组中dispatchRequest的后面,把请求拦截器和相应拦截器forEach将它们分unshift,push到chn数组中,为了保证它们的执行顺序,需要使用promise,以出队列的方式对chn数组中的方法挨个执行。

加分回答 :
Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中。从浏览器中创建 XMLHttpRequests,从 node.js 创建 http 请求,支持 Promise API,可拦截请求和响应,可转换请求数据和响应数据,可取消请求,可自动转换 JSON 数据,客户端支持防御 XSRF

🎃专栏分享:

JavaScript相关面试题就更新到这里啦,相关 Web前端面试题 可以订阅专栏哦🥰
专栏地址:《面试必看》
面试刷题神器:牛客网


名言警句:说能做的做说过的 \\textcolorred 名言警句:说能做的做说过的 名言警句:说能做的做说过的

原创不易,还希望各位大佬支持一下 \\textcolorblue原创不易,还希望各位大佬支持一下 原创不易,还希望各位大佬支持一下

👍 点赞,你的认可是我创作的动力! \\textcolorgreen点赞,你的认可是我创作的动力! 点赞,你的认可是我创作的动力!

⭐️ 收藏,你的青睐是我努力的方向! \\textcolorgreen收藏,你的青睐是我努力的方向! 收藏,你的青睐是我努力的方向!

✏️ 评论,你的意见是我进步的财富! \\textcolorgreen评论,你的意见是我进步的财富! 评论,你的意见是我进步的财富!

以上是关于牛客网算法八股刷题系列K-Means真题描述的主要内容,如果未能解决你的问题,请参考以下文章

牛客网算法八股刷题系列卷积函数随机梯度下降ReLU

「解析」牛客网-华为机考企业真题 41-60

牛客网高频算法题系列-BM14-链表的奇偶重排

牛客网刷题ACM模式 Objc Swift

牛客网高频算法题系列-BM7-链表中环的入口结点

牛客网高频算法题系列-BM8-链表中倒数最后k个结点