Redian新闻
>
thinkpad的电池也都是集成的了?
avatar
thinkpad的电池也都是集成的了?# Hardware - 计算机硬件
j*a
1
对于这个问题:找单链表的倒数第m的节点。
资料上说,用两个指针,第一个指针先走m步,然后两个指针一块走,等第一个指针到
了这个链表的end,第二指针指的就是我们要的节点(优化方法)。
这个是个解决方案,但是我觉得的这个方法没有这么大的优点使得每一个资料都给这个
方法。
简单的方法是,先走这个单链表一遍,算出节点的个数是n,然后再找链表中顺数第n-m
的节点。
优化方法,看起来是遍历链表一次,但是每次都是要让两个指针走一步,而且这两个指
针操作完全有可能都导致内存的page faulting。简单方法看起来是遍历了链表两次,
但是每次操作只让一个指针走一步。我甚至觉得这个优化的方法实际比简单方法要性能
差(如果过它的两个指针的next都导致内存cache换页)。
大家说那?
avatar
n*7
2
看了T470S和X1C都是这样
用个两年电池不行了,这超极本就鸡肋了
手机虽然基本都集成了
但是主流型号很容易买到第三方电池自己换
这thinkpad的集成电池不知道过两年想换好搞不
avatar
P*l
3
n个里倒数第m,是正数第n+1-m个
avatar
z*e
4
这个,有一段时间了吧,不难换
avatar
b*c
5
原因是这样的,你的方法只适用于 ""这个链表是不变的""
比如说,题目已知当碰到链表尾时,头结点有可能被砍掉,你再从头部找正数第n+1-m
就错了
avatar
d*a
6
啥叫集成?
直接焊在主板?

【在 n******7 的大作中提到】
: 看了T470S和X1C都是这样
: 用个两年电池不行了,这超极本就鸡肋了
: 手机虽然基本都集成了
: 但是主流型号很容易买到第三方电池自己换
: 这thinkpad的集成电池不知道过两年想换好搞不

avatar
j*a
7
多谢大牛指点!
还有其他的吗?
avatar
b*c
9
如果每次读取节点值的时间很长,而且m不大的话,直接开数组存最近的m个节点值,这
样访问节点次数就是n了
avatar
n*7
10
我以为是用线什么的连着的,即使可以更换也类似hacking
后来发现官方网站就有电池更换的文档
thinkpad就是好

【在 d******a 的大作中提到】
: 啥叫集成?
: 直接焊在主板?

avatar
l*a
11
你这理由太牵强了吧?
按照你的理论,即使那个所谓的标准做法,
fast pointer走到头之后,如果中间有结点被删掉,你能得到正确结果?
对于其他任何问题,如果需要两次loop
按照你的说话,如果一次loop后有数据被修改/删除,
那你刚才的操作岂不白费了。

m

【在 b*****c 的大作中提到】
: 原因是这样的,你的方法只适用于 ""这个链表是不变的""
: 比如说,题目已知当碰到链表尾时,头结点有可能被砍掉,你再从头部找正数第n+1-m
: 就错了

avatar
l*a
13
我认为你的想法正确
其实一个指针两次,根两个指针一次遍历的结点数目一样
两个指针是一个好的思路,但效率上并不真正那么优化

-m

【在 j*******a 的大作中提到】
: 对于这个问题:找单链表的倒数第m的节点。
: 资料上说,用两个指针,第一个指针先走m步,然后两个指针一块走,等第一个指针到
: 了这个链表的end,第二指针指的就是我们要的节点(优化方法)。
: 这个是个解决方案,但是我觉得的这个方法没有这么大的优点使得每一个资料都给这个
: 方法。
: 简单的方法是,先走这个单链表一遍,算出节点的个数是n,然后再找链表中顺数第n-m
: 的节点。
: 优化方法,看起来是遍历链表一次,但是每次都是要让两个指针走一步,而且这两个指
: 针操作完全有可能都导致内存的page faulting。简单方法看起来是遍历了链表两次,
: 但是每次操作只让一个指针走一步。我甚至觉得这个优化的方法实际比简单方法要性能

avatar
b*c
14
这么说比较清楚,getVal(node *p)这个函数被一个class封装好了,但这个class希望
不过分占用内存,所以当一个node被访问时,位于他的比如说10000位之前的node会被
释放掉,假设m<10000,那么标准做法只要求连续m位不变就行了
我想这样的假设是有实际意义的吧

【在 l*****a 的大作中提到】
: 你这理由太牵强了吧?
: 按照你的理论,即使那个所谓的标准做法,
: fast pointer走到头之后,如果中间有结点被删掉,你能得到正确结果?
: 对于其他任何问题,如果需要两次loop
: 按照你的说话,如果一次loop后有数据被修改/删除,
: 那你刚才的操作岂不白费了。
:
: m

avatar
j*a
15
网上给出这个两指针算法,我也就认了。关键是我看了一个看起来很专业的讲算法的书
,分析这个问题有一整页还给出这个两个指针算法,我就有点纳闷,使劲想原因,所以
还是这个问问各位大牛心里有底。

【在 l*****a 的大作中提到】
: 我认为你的想法正确
: 其实一个指针两次,根两个指针一次遍历的结点数目一样
: 两个指针是一个好的思路,但效率上并不真正那么优化
:
: -m

avatar
e*l
16
分两次走要多用一个变量存储长度吧。用int么?要是链表长超过int的范围呢?超过
double的范围呢?...
avatar
b*c
17
哈哈,有这么大 储存介质吗

【在 e***l 的大作中提到】
: 分两次走要多用一个变量存储长度吧。用int么?要是链表长超过int的范围呢?超过
: double的范围呢?...

avatar
l*a
18
别这么说
他的想法很好,尤其是对test职位
考虑到这些非常规scenario是必须的

【在 b*****c 的大作中提到】
: 哈哈,有这么大 储存介质吗
avatar
r*y
19
good point. smart

【在 e***l 的大作中提到】
: 分两次走要多用一个变量存储长度吧。用int么?要是链表长超过int的范围呢?超过
: double的范围呢?...

avatar
y*g
20
写code的时候一般不考虑container size大于int吧, int大小和pointer一样,如果
size比如int大了那pointer就有重复了,,

【在 l*****a 的大作中提到】
: 别这么说
: 他的想法很好,尤其是对test职位
: 考虑到这些非常规scenario是必须的

avatar
a*m
21
linkedlist不是连续的。通常情况下前后两个指针cache missing可能性比节点跳转的
cache missing要少吧。当然对于特定情况还是要根据具体问题找最好解法了。

【在 j*******a 的大作中提到】
: 多谢大牛指点!
: 还有其他的吗?

avatar
y*n
22
有的是要求只用一个循环,只能用两指针,有点脑筋急转弯
否则效率一样
avatar
y*g
23
linked list 什么时候page fault 很难说吧
avatar
i*h
24
很好的讨论,我也觉得楼主说的有道理。只不过单指针的做法intuitive,答出来不叫
本事,双指针的做法让人感觉很牛,因为一般人不会往那里想,很多面试官就是这种感
觉。
avatar
z*t
25
通常面试官期待的解法是用两个指针只遍历一次。代码可参考下面链接中的代码:
http://codercareer.blogspot.com/2011/10/no-10-k-th-node-from-en
你提到的两个指针可能引起page faulting的问题,由于链表的结点通常在内存中分布
不是连续的,因此即使只有一个指针也同样可能会引起page faulting。在page
faulting这方面,这两种思路其实没有本质区别。
不过这些分析都是定性的,哪位做个大数据量的实验,采集一些关于时间性能比较的数
据做定量的分析?

-m

【在 j*******a 的大作中提到】
: 对于这个问题:找单链表的倒数第m的节点。
: 资料上说,用两个指针,第一个指针先走m步,然后两个指针一块走,等第一个指针到
: 了这个链表的end,第二指针指的就是我们要的节点(优化方法)。
: 这个是个解决方案,但是我觉得的这个方法没有这么大的优点使得每一个资料都给这个
: 方法。
: 简单的方法是,先走这个单链表一遍,算出节点的个数是n,然后再找链表中顺数第n-m
: 的节点。
: 优化方法,看起来是遍历链表一次,但是每次都是要让两个指针走一步,而且这两个指
: 针操作完全有可能都导致内存的page faulting。简单方法看起来是遍历了链表两次,
: 但是每次操作只让一个指针走一步。我甚至觉得这个优化的方法实际比简单方法要性能

avatar
m*t
26
m比较小得时候用两个指针更好。因为指针地址会在cache中,page fault也会少,因为
page entry 也还在 tlb 中。
avatar
j*x
27
自己写代码测试一下那种快
相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。