[Inside] What’s the assumptions you are making

本文详细探讨了在实现链表复制算法时需要澄清的关键假设,包括random指针的正确指向、可能指向的地址类型、是否复制其他指针、内存管理策略、错误处理方式、计算和存储复杂度要求、特殊字段处理、线程安全性、应用场景及输入验证,以及允许的节点重复性。同时,文章还提供了针对不同功能需求(如strstr、StringtoInteger)的深入分析,强调了澄清假设对于设计高效、健壮算法的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在我们写代码的时候,其实无时不在做assumption,这些assumption会引导我们使用不同的算法,不同的实现,如果我们能够意识到这些assumption,并能validate这些assumption,就可以得到一个好的assumption,好的assumption就可以引导我们设计出更好的算法,更好性能的实现。所以在设计一个算法、实现一份代码之前,一定要把问题搞清楚了,也就是clarify assumption,哪怕那些觉得理所当然的assumption也要拿出来validate/verify一下。

作为练习的一部分,把前面的几个题目翻出来,看看我们在开始设计算法和写代码之前,都可以clarify哪些assumption:

有一个链表,除了一个正常的next指针指向下一个节点外,还有一个random指针指向其他节点,向前、先后或者NULL,现在实现一个算法来Copy这个链表。开始问问题吧!

1. random指针是否也需要保持正确的指向;

2. random指针是否可能指向链表节点和NULL以为的地址;

3. 如果链表中还有其他指针,是否需要把指针指向的对象也复制;

4. 如果OutofMemory,是能复制多少就复制多少,还是不做任何复制;

5. 如果碰到任何异常,是throw exception,还是返回错误代码;

6. 计算复杂度和存储复杂度的要求是怎样的;

7. 对节点进行复制时,是否有ID、CriticalSection、kernel handle等字段需要特殊处理,如果需要,如何处理;

8. 对节点进行复制时,是否需要考虑线程安全(改变共享数据结构时需要特别考虑);

9. 该函数的应用场景是怎样的,是否需要对error input做全面的处理,或者内部使用并可以assume其输入在限定范围内,可以用assert来避免非法输入?

10. 是否允许duplicate的节点存在?

11. 我是否可以临时修改原来的链表,在函数返回前使之恢复到原来的状态。

 

还有哪些事情跟这个问题相关,需要clarify呢?想到了可以再加。下面开始下一个练习:

题目要求实现strstr(在一个字符串中寻找另一个字符串出现的位置)

1. 是否区分大小写;

2. 在pattern字符串是空字符串时,应该返回什么;

3. 这个函数不涉及写操作,所以不考虑线程安全问题,right?

4. 是否有效率要求?

 

String to Integer (atoi)

1. 如何处理前导和后置的空格;

2. 如何处理中间出现的空格

3. 是否支持-,+或者其他的任何符合,比如*/.等

4. 是否支持部分parse,比如123abc返回123,或者abc123,a34等

5. 是否支持wide char;

6. 如果输入的字符串是NULL,或者为空,如何处理?

7. 错误处理是通过返回值还是抛出异常;

8. 如果错误处理是有错误时返回0,那如果本身要转换的字符串代表0,如何处理;

9. 如果字符串特别长,超出int或者unsigned int的范围,如何处理;

 

转载于:https://www.cnblogs.com/whyandinside/archive/2012/12/25/2831887.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值