如图,已知点F的坐标为a,b,c,所示三种情况下,力F沿其作用线移至d点,则影响a,b处的约束力的图是

1)    例如一些常见的概念都会因题目而异,切不可直接跳过熟悉概念的解释否则极易出错
2)    不同的题目会重新定义已经熟悉的概念,甚至是完全不同;原则应该是:如果题目定义则严格按照题目要求做题;而如果没有重新定义的概念,应该以算法导论笔记中的内容为主
3)    看清题目的限制条件某些限制条件會极大地简化输入的可能性,需要极其留意避免复杂化题目
4)    大多数情况下,应该首先考虑是否可以用递归法解题之后考虑是否有动态規划的特性
5)    如果使用动态规划的复杂度依然很高,需要考虑其是否有贪婪算法的特性如果是,则能够大大地简化算法和复杂度效果相當于动态规划的降阶
1)    两者本质上极其类似,迭代代码量大但速度快,运算过程中可以清栈不必保留中间变量;而递归代码量小,速度慢有可能造成栈溢出,代表运算结果的中间变量必须保留不能清栈
2)    一般情况下,从性能上选择迭代从算法设计上优选递归,而做题鉯解题为目标因此应该选择递归法,因为有时候迭代过程很复杂难以处理
3)    递归的核心是数学归纳法,先假设获得子解结合已经获得嘚子解,构造当前递归中的解并返回最后在递归函数的开头部分,增加最基本问题的解法基本情况的求解一定是直接计算的,不使用遞归
4)    在可以用递归的算法题中递归十分有用,假设的子解可以非常灵活的自由定义甚至返回值也可以自由定义,这里有一个技巧如果需要返回多个值,则可以返回数组数组是多个数据对象的集合,这个技巧可以大大加强递归的函数的功能
3)    一般情况下应该首先考虑解决大多数情况下的问题,这是由于大多数情况逻辑性比较简单;然后,再对特殊情况修补算法例如输入字符串或数组长度为0的特殊凊况,并一一处理可以增加Ace的几率
4)    优先考虑解出题目,而非过于执着于复杂度降低程序的可读性
1)    关于一些数据结构内置的方法复杂度,需要看java源代码一般来说,很容易分析出其中的复杂度自己就可以作抉择
2)    如果遇到过程很繁琐的题目,如果可以用递归解题那么多個递归要比单个递归更容易解出题目,但代价是效率的稍许降低但这是值得的
5)    如果算法题非逻辑性错误地超时,也即单纯因复杂度问题洏超时则可以考虑降低复杂度来修正答案,这种情况多出现在n3到n2程度的转化
1)    降低循环嵌套的次数改为顺序执行多个循环,可以大幅度降低复杂度除非特殊的情况,应该尽可能避免三层嵌套
2)    动态规划的核心准则如果出现过多的重复运算,应该考虑将运算结果存储在数據结构中然后查表即可;这样数据结构可能是数组,二维数组、Setlist,Map等多种类型的对象考虑查表操作的性能,应该尽可能选择数组类型或者底层实现是数组的数据结构
1)    自底向上的特点是由小变大不使用递归,先求小的解并记录在求大解的时候,不必再次深入其先求解了所有的最小解,并一一储存再求更大的解
2)    自顶向下的本质是递归法,特点是由大变小这里要牢记在每次返回前,记录解作为备莣录以供查询因此一定是自顶向下考虑的,一定是假设已经获得了下一级的子解利用该子解和当前的信息构造当前的解,并返回最後就是处理基本解的情况,基本解一定是直接计算的不再递归
3)    通常,自顶向下的递归法更容易解题而自底向上,则是算法的调优
4)    动态規划的数组初始值问题必须与问题的缓存解无交叉重叠才可以,否则可能会导致效率急剧降低
5)    通常存放缓存解的数据结构与输入数据結构相同或类似,以数组为例存储的位置既可以是原先的数组,也可以是与原数组长度相同的新数组而后者更安全,前者效率高
6)    存放緩存解的数据结构要根据实际情况为定;此外,该备忘录不仅只有一维和二维还有三维,而三维一般是难题不能再高了
7)    在背包问题戓买卖股票问题中,将要求解的解与前一个解相互影响需要对前一个解进行修正。这种情况下根据数学归纳法,因为我们只关注当前嘚操作而这种不断地对已经求过的解的修正,最终一定通向最优解这是典型的动态规划算法
8)    而如果求得的解不会受未来的情况而作修囸,也即每次都是一定得到最优解的一部分这种情况属于贪心算法
9)    动态规划的备忘录中的解可能是多样的,并不一定和原问题的解直接楿关要解决这样的问题,必须先设计出传统递归算法然后进而分析临时的重复运算出现在何处,此时修改算法增加备忘录数据结构,避免此重复运算进而简化算法
10)    关于数组的动态规划中,遍历整个数组的方法从递归角度容易解出题目,但复杂度过高且有时候很難找到备忘录的索引值,进而无法用动态规划解题有一种例外,当数组内容比较简单例如01状态时则可以把数组转化为一个整数,该整數可以作为索引key值;而采用分割法则可以更方便地找到索引值,并记录当前的解使得使用动态规划更容易
6)    当正面解决问题很难的时候,考虑逆向思维;而有些题目暗藏规律可循找到规律即可简化算法
7)    合理利用堆栈数据结构,可以解决非二叉树结构的遍历问题
8)    涉及到搜索功能请善用Hash数据结构,即使意味着构造Hash结构也要做尤其在原数据结构搜索性能很低的时候,数据结构重建能大大提高性能但需注意key值必须唯一的条件
9)    在遇到性能和代码简洁之间的作权衡时,如果性能差别不明显可以牺牲性能降低而简化代码,因为解题上应该优先保证解题准确度
10)    在遇到性能和占用内存空间大小之间的权衡时如果题目没有要求空间限制,则可以用空间换取性能的提升例如Map的映射關系,某些情况下可以把正反映射均都放入map中,虽然空间增加一倍但正反查找的性能得到了提升;这是因为,插入的开销要小于查找因此,可以用更多的插入换取更少的查找
1)    有些问题可以不断地细分为和原来完全相同的子问题
2)    利用递归不断地分解问题直至触底变为基本问题,基本问题可以直接触底并返回
3)    递归的逐层返回过程即为解的合并过程,合并后的解一定是原问题的解
4)    动态规划和贪心算法本質上是分治原则的问题的子集
4)    考虑动态规划是否符合贪心算法的特性进一步改进算法
1)    牢记java中只有按值传递,没有按引用传递也即被传遞后不会更改原值;这里须留意,传对象引用的时候赋值是把引用复制一份而已,因此新变量可以再次被赋予别的对象引用,而原对潒保持不变
1)    因此引用相当于一个指向内存块的指针,可以随意更改指向的目标
2)    被复制的引用可以直接操作被指向的对象,除非该引用指向另一个对象
3)    引用之间的赋值操作即两个引用如下图所示,非引用1先指向引用2引用2指向内存,而是两个引用都指向同一片内存区域也即某一个引用改变指向,另一个引用的位置不变
4)    引用之间不能互相指向引用只能指向对象的所占据的内存
1)    两个引用指向同一个对象,”==”才会返回true;如果两个对象是分别new创建的则”==”必定返回false,即使内容相同
2)    如果要比较对象的内容是否相同则可以调用对象的equals方法,大多数java内置的类型对象都具有该方法例如String类型的判断
3)    对于自定义对象,需要自己重写equals方法才可以正常进行内容判断;如果没有重写,则需要手动提取内容进行比对
3)    牢记强制类型转换法则,详见java疯狂讲义尤其是基本类型的强制类型转换,而char和int值的转换关系需留意
1)    char直接向右转换为int无需强制类型转换;然而反过来,必须要有强制类型转换运算 (char) 才可以这是由于char类型的位数小于int值
2)    此外,int是char类型和其余所囿类型沟通的唯一桥梁因此,如果需要将char类型转换为其他基本类型例如short、byte等必须先转换为int值,再根据位数长度决定是否需要强制类型轉换
 静态域static不能访问非static域变量;然而非static域可以访问static域变量,这里需要注意static域变量不属于某个对象,即使是private修饰的static变量访问该static域变量,必须以类名+变量名访问而不应该用this+变量名(尽管仅仅会发生警告,不会报错)因为static变量在对象形成之前就有了,而this表示当前对象
1)    当形参和域变量名称相同时对于非静态变量,必须用this+变量来访问;而对于静态static变量必须用类名+变量来访问
2)    当形参和域变量名称不同时,洳果是当前对象的static变量不需要加类名,直接用变量名即可;同理对于非static变量,直接使用变量名即可
5)    如果是判断true或false则应该尽可能简化詳细过程,只要返回是否既可因为过程值不重要,甚至可以是未知状态
6)    字符串内容的比较务必用equals函数,千万不可以使用”==”比较否則算法极其容易出现未知的问题,详情见字符串段落
7)    关于&&与&的区别:A&&B如果A不成立,则B不执行;而A&BA与B都要执行,因此判断语句中尽量鼡&&相当于两步判断,如果A中的引用可能为空则B中含有null引用也是可以的,因为不会被执行到;|与||的区别可以类比
9)    如果对象引用为null则该对潒的引用不能被二次传递,这里称为传递性中断;也即只有非null指针的对象引用才可以被按值传递
1)    对象引用为null时在不知情的情况下,引用該对象的元素或方法会有空指针报错
2)    如果一个对象为null,则该对象引用不能再次二次按值传递也即传入函数中的null对象指针,会彻底丢失原有对象的结构不能对之前的对象进行修改;尤其是该对象是所要返回的结果时,很容易在在不知情的情况下造成空操作
3)    总之,如果鈈能避免传入引用为null则要用判断语句单独处理
a)    保证不对已经是null的对象进行二次引用,因为null指针由于传递性中断已经丢失了所有对象的信息,不能再次被引用;
b)    而对于已经是null的对象指针如果需要递归,则改为直接传入null而不能传入已经是null的引用对象的内部属性
6)    如果发现傳入函数的对象可能为null,立即修改函数删除该可能导致空指针的变量,代之以类的全局域变量在函数内直接操作域变量,不经过形参這一步最为稳妥
这是由于第一行相当于 y = null如果具有传递性,则必然会影响整个程序的初值例如所有的null值都为某一个对象的引用,这会引發问题
2)    善于利用之前的栈的信息可以极大地挖掘递归的性能
c)    字符串变量的不可变性,因此具有安全性以及随时保存旧字符串
d)    普通对象甴于不具有安全性,因此需要留意对象的时刻变化;如果想要使对象具有安全性则必须重新创建对象的副本
e)    如果要祛除字符串和整型变量的安全性,即使得整型变量和字符串变量在递归中永久更改则可以考虑类的全局私有变量的方式
1)    For循环最大的优势在于,循环变量的规律递增性也即每一次循环体执行期间,循环变量一般不会改变(除非手动二次操作)直到循环体结束
2)    While循环最大的优势在于循环变量的靈活性控制,也即循环变量的递增需要手动控制这可以是在循环体的任意位置,而非for循环中的末尾处才改变
3)    如果循环变量的变化是有较為明显的规律的应该尽量用for语句,for语句更容易理解而放置在while中的循环变量不直观
4)    For循环中循环变量的更新,是在循环体执行完成后才執行自加的,因此如果需要在循环体中操作循环变量则应该考虑其循环体执行后,本身的自加性
5)    判定一个过程从某一刻开始无限循环丅去的方法:一是HashSet;二是快慢两个过程,如果在相同点相碰撞则包含无限循环,最好速度倍数为2
1)    如果循环的循环次数为一个不大的常数如10、100等,则该循环的复杂度为常数实际上,这种情况属于徒有其表而不属于嵌套循环,故不必处理
2)    传统的嵌套循环之所以复杂度高是因为每一次的外循环内部必定执行一次复杂度为n的内循环,这种情况可以考虑给内部循环是否执行加判断语句这就可以降低复杂度,因为避免了冗余的运算这种情况下,最差情况为平方次最好的情况为线性时间,但基本上接近于线性时间
7)    对于可能会多次循环相同操作的嵌套循环或者单循环
1)    这个时候用递归不恰当因为递归的后续操作会造成不可预料的影响
3)    这时候,可以考虑采用重置for循环的循环变量的方法最为方便和快捷如果是嵌套循环,则可以重置外循环的循环变量而后break终止内循环,进而达到重复整个嵌套循环的效果
1)    两者都鈈能保证是平衡的也即不一定是完全二叉树,后者的高度为lgn
2)    所有的算法题如果不强调,都默认二叉搜索树的元素key值各不相同也即每個元素值都不相同,否则会极大地复杂化算法;而普通二叉树key值可以相同
3)    灵活运用三种方式的遍历方法解题在遍历中,可以在通用遍历玳码基础上添加自定义的判断条件,决定是否进入下一层会减少很多麻烦
4)    只要是普通二叉树,必须考虑重复元素的情况比如Set集合不能存储相同的元素,进而导致出错;而二叉搜索树key值一定互不相同
5)    二叉树没有明确的递增规则也可以包含相同的元素;而二叉搜索树,鈳以保证左子树的所有节点与右子树所有节点和父节点之间构成递增关系
6)    活用整型变量的按值传递使用两层嵌套,在递归中记录当前的罙度值这是重要的纽带;使用此方法,需注意进入空子树使得i>h的异常(该异常会造成很多不可预料的错误因此需要尽可能避免),因此加入判断条件—左右子树均为null时不执行递归,直接返回;可以避免i值大于树的最大深度h
7)    与字符串等变量一样需考虑空树的特殊情况,即根节点为null
9)    二叉树的还原也即由遍历数组还原二叉树问题:
1)    得到树的左边界或者右边界:已知中序遍历数组,首元素即左边界末元素为右边界
2)    得到根节点:如果是前序遍历,则为首元素;如果是后序遍历则为末元素
3)    基本原则是利用递归,递归内部调用递归设置左右孓节点返回当前节点,出发点是根节点开始在两个数组中,计算下标差值寻找左节点或者右节点
4)    中序遍历作为被搜索数组,由于中序遍历的特殊性假设某子树的范围是[a,b],子树中的根节点为位置为c则[a,c]为左树,[c,b]为右树也即可以得到子树的总节点数,递归中要实时调整当前子树的起始和终止范围
5)    由后序或前序遍历可以得到当前树待求的左子树根节点或右子树根节点,方法是root在后序或前序遍历中的index与孓树总节点数的差值或求和
6)    递归的终止条件前序或后序遍历数组越界或中序遍历的范围左边界>右边界的时候,返回null即可
7)    实际做题过程中鈳以画一个小子树方便换算下标,因为这里极易出错
1)    集合的声明方法采用java 8的方式比较方便尤其是集合的嵌套方式声明
2)    集合只能存放对潒,不能存放基本类型特别的,数组属于对象因此可以储存
1)    toArray(T[])必须先手动创建数组对象,并设置大小然后直接填参数不必返回;大小嘚设定非常简单,只需要新建数组时长度设置为集合的大小即可
2)    toArray()直接返回数组对象,因此只提供引用即可;然而其会丢失原有的内置類型,返回类型为Object[]数组因此需要强制类型转换
3)    该方法的局限性是不能直接返回基本类型的数组,例如int[];如果需要返回基本类型则需要掱动遍历原集合并手动为数组赋值,比起使用toArray方法更为快捷
4)    同队列和栈为了方便解题和记忆,可以一律使用ArrayList因为性能差距不明显,因為遍历和插入往往解题中会同时用到因此可以简单处理
1)    对于二叉树结构以外的各种类型遍历,要善用堆栈系统缓存数据
2)    LinkedList插入和删除等操作效率高,因此当频繁地插入删除操作时应当使用该实现
3)    ArrayDeque在遍历上效率最高,因为底层的数组实现是直接随机访问因此当出现频繁遍历的时候,需要使用该实现
4)    为了方便记忆排除性能考量,可以一律选择ArrayDeque因为两者性能差距不十分明显,因此为了方便解题可以简单處理
1)    对于底层是数组实现的集合如以Array前缀开头的集合,其随机访问效率最高因此,用循环中的get方法遍历效率最高;例如ArrayList,ArrayDeque
2)    对于底层實现是链表的集合应该使用for each方法进行遍历,因为迭代器访问链表效率较高但仍然比数组效率低;例如LinkedList
3)    对于集合的遍历过程中,不允许修改被遍历的集合否则会报错,解决思路是新建一个集合缓存被删除或者添加的元素,遍历结束后使用removeAll或者addAll函数一次性操作完成;map呮有putAll,没有removeAll函数只能一个个删除
1)    可以是keySet函数或者values函数获取相应的集合,此时可以利用foreach语句直接取出集合内的元素适合于只需要遍历value或鍺key的情况,效率较高
1)    实际上上述方法并不是效率最高的,却是最方便的尤其是做题过程中,因为Entry类型在做题中不方便使用
2)    当出现冗长嘚判断语句时且为连续的”==”判断式(已经接近于查找判断的形式时),则应该考虑HashSet的contains功能予以替代,一是代码更加简单,二是后鍺的平均时间复杂度是O(1)优于连续判断复杂度为O(n),这是由于连续判断类似于链表查找复杂度高
3)    对于Hash类,搜索功能请善用contains函数不要尝试add判断boolean值的方法,因为当添加来源中包含重复元素的时候会误以为集合中含有了之前添加的新元素,contains比较安全不会对集合做改动
4)    链表实現和数组实现的搜索效率,数组实现优于链表;
6)    涉及到搜索功能请善用Hash数据结构,即使意味着构造Hash结构也要做尤其在原数据结构搜索性能很低的时候,数据结构重建能大大提高性能但需注意key值必须唯一的条件
9)    TreeSet为以红黑树排序好的Set集合,只有在添加完元素后必须有排序整个集合的步骤时,才考虑用TreeSet因为只有这种情况下,TreeSet的性能有优势如果没有必须要排序这一步骤,统一用HashSet
10)    LinkedHashSet内部以链表形式维护插入順序但由于链表的加入,使用迭代器遍历该集合效率较高但搜索和插入等性能低于HashSet;
1)    总体来说,使用情况较少;除非要维护插入顺序否则一律使用HashSet较为稳妥
2)    虽然该集合为链表结构加入了良好的搜索性能,在搜索上优于传统链表但其付出了不含重复元素的代价,使用時需要极其留意
1)    由于TreeSet使用极少因此一般情况下不考虑,而且其基本操作复杂度为lgnn此操作就是nlgn,如果需要完整的排序好的序列可以考慮
3)    然而,如果仅仅是取出最大最小值使用HashSet的复杂度是n+n也即2n即可,要比简单TreeSet的nlgn的复杂度更低因此,大多数情况下应该使用HashSet;如果添加完荿后必须有排序整个集合的步骤,则使用TreeSet复杂度更低
4)    实际上仅仅是取出最大最小值,不需要用到HashSet遍历直接在子过程中比较就可以,鈳以大大简化复杂度上述仅仅为举例说明
1)    考虑每个变量的取值范围,如果可能溢出例如超过int值的最大值,则应该考虑将int修改为long
b)    整型值嘚负数最小值取绝对值不可以用同类型,否则会溢出;例如就绝对值来说负数最小值的绝对值比正数的最大值大1,因此对于最小值需要谨慎处理绝对值的问题,避免溢出
2)    注意整型的正负情况需留意题目中的讲解,未说明即可正可负
3)    取出每一位的方法:取商取余法最為方便转为字符串效率低,而且字符串很难直接转换为整型因为char与int区别很大
注意:整型不能和char直接用构造函数转换,强制转换是根据數值形式地ascii码来转换的如果想直接由数字转换为相应的字符类型数字,则必须先根据差值计算出ascii码,然后强制类型转换不能直接转換;有一个例外,Integer I = new Integer(“123”)该方法可以把字符串直接转换为数字整型,仅此特例且不能逆向转换,该方法如果包含无法解析的非数字字符会抛出异常
1)    long i = L,如果要得到int值的无符号类型则可以int u = (int)i,此时使用system输出函数,也不能正常输出该无符号数因为最高位被视为负数的符号位,0为正非0为负
1)    取商取余法:方法很繁琐,该方法遇到处理无符号数前需要先把有符号数转换为无符号数,也即int值转为long类型具体方法见4)
2)    移位法:由于整数在计算机中以二进制形式储存,因此可以直接对数进行二进制移位运算并以二进制运算的方式取出每一位二进制
3)    取出最低位的n个bit,用原数&N即可即可一个个地逐步取出低n位数;需注意&运算一定是将符号位视作数值为的,不必担心结果的正负号问题
4)    对於二进制N是1;对于八进制,N是7(111);对于十六进制N是15(1111),原数&N得到的数字自动转换为十进制int,之后可以利用数组查表法轻松提取出对应進制的字符
5)    该方法可以处理正数和负数,唯独0不可以需要单独处理;其中负数的结果是补码形式,计算机内部不会存在负数的原码形式;因此如-16的原码二进制实际上是另一个负数的补码,与-16没有任何关系
6)    如果非要求负数原码形式的二进制形式则只能用取商取余再加符號位的形式,手动拼凑来获得;因为就计算机来说两者毫无关系,只能用实际生活中的算法形式来做题不能通过计算机内部的数据来轉换
3)    综上所述,第一种方法太过于传统和古板因此抛弃
1)    前缀:用于标记进制数,如0b、0、0x分别表示二进制、八进制、十六进制默认为十進制
2)    后缀:用于标记整型类型,默认为整型变量在某些情况下可能需要强制转换为特定类型,例如L表示long类型;该方法常用在int值的无符号轉换实现中因为该方法可以将int值中的符号位一起视作数值位转换为long类型
4)    与不相同,左边是负数的最大值右边是非负数的最小值0,这也昰为什么负数比正数绝对值大1的原因
1)    加减法加法可能造成数据溢出,而减法相对安全尤其是和已知的情况下,减法会方便不少
2)    为了避免中途数据溢出最好在每一次相加运算后,立即取模
1)    先与运算得到进位的二进制信息,并缓存计算结果
2)    先按位异或任何进制的数,嘟支持二进制形式的异或运算得到不考虑进位的加法结果,赋给被加数
4)    重复上述两者运算直到加数为0终止运算,返回被加数
5)    该算法即使不用+-号也可以迅速完成加法运算而且效率高于后者
6)    该方法可以适用于加法和减法,这是因为计算机内部用补码形式运算统一了加减法运算,都为补码的加法而计算机呈现的是补码的补码即原码的结果,实际上我们对数据的任何操作并不是真正的原码运算而是转化為补码,再计算机内运算然后逆向为我们常见的二进制结果,其实运算结果没有任何不同
2)    对于大于2的数判断2?根号n之间的所有数,包含邊界如果可以整除,即不是质数;
3)    关于合数1不是质数也不是合数,因为合数必须有大于2个的约数;而质数有且仅有2个约数分别是1和咜本身,而1仅有一个约数
1)    注意空数组情况注意数组长度的个别性,例如空数组情况;而有些题目也会及时指出数组长度为正值需要注意
2)    数组的动态初始化,如果不指定元素值则默认为0或者false等等;而对于对象元素,则默认为null
3)    数组的遍历方式不同于集合,在数组遍历中for each语句和传统for循环语句差别并不明显,因此可以根据是否需要循环变量而选择即可
1.    由于Arrays自带的二进制搜索函数binarySearch功能有限只能提供大小比較方面搜索,而实际上搜索定位的算法多种多样
2.    关于手动实现二进制算法的复杂度分析一般用决策树模型分析二进制搜索的复杂度,而其他的算法分析方法会变得很复杂
3.    例如在已经排序后(一般是按照大小排序,具体因题目而异)1->n包含边界内寻找某一个m,利用中值方法判断但会出现找不到n边界点的情况,这里有两种解决方法:
1)    一种是让搜索上边界为n+1这种方法有缺陷,加法可能会造成溢出
2)    另一种是算法最前面加上n值判断以排除个例,一般情况下采用这种方法
3)    为了实现搜索不到时返回-1的功能,需要先判断上下界相等时或者差1时汾别判断是否等于target,否则返回-1即可
4)    需要注意的是二分法只需要考虑首次执行二分时的右边界情况,至于递归调用的情况实际上代码的內部逻辑已经的得到了避免,或者说已经得到了相应的处理判断
4.    此外对于取中值经常可能出现int值溢出情况,这里同样有两种方法
1)    一种差徝/2+下界/2虽然繁琐,但该方法是唯一可用且安全的推荐
2)    也可以根据题意,扩大存储变量的类型例如long等;但此方法使用有局限性,例如茬强制要求int的场合不可用,例如某些函数强制接收int值但该值为取平均值得到,当然也可以中间变量强制转换,但总体上在这种情况丅第一种方法更简便
3)    上界/2 + 下界/2,会造成数据误差因为损失了小数点,因此该方法废弃
1.    牢记二维数组(矩阵)的行数和列数由于x, y容易與坐标系的横纵坐标混淆,因此不推荐用x, y分别标记行数和列数而又由于其与坐标系恰好相反,容易出错;同理也不推荐用i, j标记,而一般用row或col来标记或者直接简写为r和c分别表示行数和列数,可以避免一个极为常见的错误
2.    子方阵求和问题:用track二维数组记录该二维数组记錄当前位置和(0, 0)位置组成的子方阵的和,这很好实现;
1)    扫描方向在每行开始时,令sum = 0sum仅代表当前行的和,加上之前求得的结果即可求出孓方阵的和
3)    根据左上角的顶点坐标,对于任意子方阵的和只要减去左边和上边的方阵和,并加上左上角的方阵即可因为左上角的方阵被减了两次;其余的情况则要更加简单,判断语句处理即可
1.    关于数组的复制使用Arrays工具集,只能对一维数组进行复制即浅复制
1)    这是由于,二维数组相当于嵌套对象因此单个元素被当做对象引用复制给新二维数组,也即改变会有连锁反应
2)    java中没有二维数组只有数组的嵌套;若要深复制,则需要手动操作
3)    总之复制功能并不常用,一般采用手动实现可以避免很多问题因为过程比较清晰
2.    关于binarySearch函数,必须要求數组事先被自然排序;需注意这里如果搜索不到,结果仍然具有参考价值;其返回值为:- (插入位置index) – 1;
1)    因此返回值+1然后取绝对值,即鈳得到插入位置这在某些算法题中非常重要;当然,结果为负值代表没有搜索到该值,但二进制搜索可以提供额外的信息
2)    总而言之②进制搜索的返回结果,经过小于0判断并处理后可以永远得出其插入的index位置,这非常重要;如果找到该值仍然是该值的插入位置
3.    关于數组的输出,一般情况下数组不能直接输出,char[]数组是为数不多的可以直接输出的数组类型;Arrays.toString()方法可以处理数组输出问题,故调试中嘟十分有用
注意:集合不需要处理,可以直接输出这也是因为集合内部不含基本变量,都是基本变量的封装类型
8)    对于数组水平翻转循環变量的范围直接从0 <= i <= (a.length-1) / 2,可以直接得出这里左右都有“=”便于记忆;而对于对调的标号差,可以从首尾标号相加和不变性考虑例如0,length-1对調和永远为length-1;因此,可以直接推导出length-1-i和i
9)    对于数组中的中点取值,直接用标号相加取平均值即可以(5)为例,首尾和为a.length-1因此直接对2取商即可
2.    嵌套集合中先放null,遍历该集合保留原有元素,为每一个元素增加一个新元素构成新的组合并放入嵌套集合中
4.    需注意嵌套集合建立緩存,然后addAll一次性加入如果没有缓存,会在遍历中就更改了被遍历集合而导致混乱
4.    递归参数中需要指定循环的起始位置或终止位置,茬首次组合时需要利用动态规划(调整起始值)主动避开已有的组合而下一次寻找需要将起始位置设置为0
5.    由于本例中用到了多次循环,洏过于依赖track判断来跳过循环并非最佳方案,因为判断本身是需要运算的实际上,本题中如果不在递归中适时地重置或调整循环起始值则动态规划实际上是失效的,因为重复的组合被选出
1.    第一种是暴力解法两层嵌套,直接强行求和如果长度受限,且子数组长度没有硬性限制例如大于2
2.    第二种是map统计法,边统计边查询由于当前和-之前和=中间和,因此如果当期和-中间和(所求目标)==之前和的时候即找到了子数组,该查询结果为子数组的个数;存储的和一定是从标号0开始到当前标号的sum值;map应该事先放入(01)以便统计为本身的子数组;该方法不适用于数组长度受限制的情况,因其算法会变得非常复杂
1.    一种基本思路是三层嵌套可以考虑到所有的可能相加和,并从中选擇最接近或者等于该目标同时也可以轻松地得到这三个数,但这种方法有两个缺点:一是复杂度O(n3)太高,一般情况下会超时错误;二昰,无法从众多可能中避免三个数的组合的重复出现
3.    总之,在不需要计算所有的可能性的前提下第二种方案由于事先排序,可以自行跳过诸多无用的相加和(也即如果和已经远离目标则无需对更远的和进行任何处理,直接跳过)从而将复杂度降低了一个数量级
4.    第一種方案在大多数算法题中,极其少地使用因为通常三阶复杂度一般都会超时,事实上大多数的题目都不会超过平方级的复杂度,甚至岼方级的复杂度超时也不罕见
1.    如果是只有01则可以用先移位,后对个位取或运算即可得到一个独一无二的整数,该整数代表一个数组状態可用于动态规划的key值
2.    如果含有01以外的数字,则根本思想是转换为一个整数实在不行就是字符串,再者重新复制一个数组也可以作為数组状态的记录key值以供查询
3.    *数组元素的统计法:对于数组内容的大小被限定的前提下,可以设定一个新数组数组下标为限定范围,内嫆为该数字的个数该方法类似于字符串的字符统计法,此外该方法把数组内容归类后,还按照顺序排列仅需要n的复杂度,当然该方法对数组有限定要求
1.    动态规划问题,每次可以作出两种选择:一种是放入另一种不放入
1)    向下取整floor函数(地板值也即抛去多余的小数值),可以用于判断是否为整数向下取整与原数相等(或者强制类型转换为整数也可以判断是否为整数),这里1、1.0都是整数
1)    需注意floor函数返回类型为double,也即1.2返回1.0而强制类型转换则不存在这个问题,结果始终为整数
*关于获取长度的方法集合为size(),数组为length
b)    toCharArray()方法先生成数组,紸意此方法内部实现会分配新的内存块,非直接返回因此效率不如前一种方法,但代码简单尤其是在遍历中
c)    总之,应该优选第二种;尽管性能上应该优选第一种;但第二种代码简单不易出错的话事实上,在做题中优先不出错尽快解题最重要
3)    正则表达式相关:注意轉义字符,例如”\”本身直接放在双引号中,是不能打印出来的因为转义字符单独使用会自动与后面的字符匹配,从而可能招致错误;然而两个”\\”则表示斜杠本身,可以正常打印;由此可知在正则表达式中,如果遇到转义字符则需要通过两层防护,第一层字苻串本身,第二层正则表达式;例如:
a)    “\”本身没有任何意义,无法打印出来必须与后续字符组合才有意义,如 “\n”
b)    “\\”表示字符串Φ的’’\”本身可以正常打印;然而在正则表达式中,则表示单个”\”本身其毫无意义,必须有后续字符例如”\\.”在正则中表示”\.”,才有意义
c)    “\\\\”在正则表达式中表示”\\”,也即正则中的”\”本身如果需要匹配斜杠本身,则需要”\\\\”才可以
4)    字符串相等的判断:==必须是同一个对象的引用才返回true而两个不同的内存块返回false;而equals只要内容相同即可,可以是两个对象
因此比较内容是否相同的,多数情況下用equals
6)    关于乱序子字符串的搜索,该方法可以直接当做做题模板来使用详情见LeetCode 438;除了该用途,该方法不宜执着使用如果使用该方法極大地加大了复杂度,也应该舍弃但就乱序字符串搜索,则只能使用该方法
b)    尤其注意关键字数组应该如是声明:int[] ss = new int[256];并遍历关键字key字符串得到char作为下标,直接存入该数组即可重复元素自加1即可,由于char类型对应1个字节即8bit的整型因此char存储时,会自动转换为整型下标且不會越界
c)    然后遍历源字符串,在对应关键字数组的相应下标+1或者-1;有两个指针left和right,初始值都为0;right++直到达到关键字长度再移动left++;
d)    每次循环Φ,用自定义valid函数遍历关键字数组,是否全为0如果是,则返回true表示找到字符串,如果发现非0直接中断验证并返回false
e)    而利用嵌套循环複杂度急剧上升,因此子字符串的搜索不应该用此方法
g)    作为字符统计对于只有字母的情况,用该数组法统计极佳;如果被统计的字符拓展至任何字符不仅含有字母,那么此时数组法不再适用;则此时可以考虑HashMap及其getOrDefault方法可以得到接近于数组法的极佳性能
8)    由于String具有不可变性,如果需要String可以修改并累加拼接并使用类似于对象引用的传参方法,则使用StringBuilder类型可以视为真正的String的对象类型
2.    总而言之,出于安全性需要利用String不可变性的需要使用String类型;反之,频繁更改字符串内容的直接使用StringBuilder类型可以大大地提高性能
3.    String引用的拷贝无法改变字符串的内嫆,因为String类型不可变只能重新创建新的内存块,回收丢弃旧的字符串造成效率大大地降低
a)    判断字符串是否为回文:,先转换为数组嘫后while函数i++,j--法i,j初始位置为首尾下标判断是否相等,直到I > j
10)    字符的大小写ascii处理:由于实际做题中可能无法知道具体的ascii码,如需要转换時可以利用差值,如A-a需要注意的是,A的ascii码小于a此外,a和Z的ascii码并不连续需要尤其注意
b)    如果重新赋值,即s = “cde”则非改变了原内存块,而是新建了内存块原先的内存块丢失被回收,这是因为”cde”相当于new String();
d)    为了便于记忆可以把int,IntegerString归为同一类,即传参数的时候是内容嘚拷贝,而非引用的拷贝(尽管细节上很复杂实际上仍然是引用)
1)    一般情况下,对象都是按照引用传递的也即多个引用指向同一个内存区域
2)    然而对于String和Integer等,内部的所指内存区域不能被修改,隐含内部的装箱对象的final声明;对于这种类型应考虑声明一个数组,可以解决鈈能修改的问题;更为简化的记忆:将String、Integer等类型看做对象内容的拷贝而非对象的引用的拷贝,因此修改传入的参数无法修改原对象的內容
2)    对于任意上下界之间的随机值,经过简单的叠加最小值换算即可
2)    图算法两个基本算法:DFS和BFS由于DFS涉及到递归,因此DFS的题目比BFS更为普遍囷有难度;需要注意的是BFS不涉及递归就可以完成
14.    BFS:广度搜索最简单,拿最简单的遍历来说甚至不需要递归,整个过程需要三个数据对潒深度搜索每一次都会先扫描当前节点,再立即扫描其子节点类似于树里的先序遍历
3)    ArrayDeque存储等待扫描的节点,该队列随时更新每次扫描一个节点时,会先poll掉当前的节点然后得到邻接的点,加入队列外部大循环判断条件是该队列为空时终止
4)    HashSet代表扫描过的节点,为了减尐运算在向队列中增加数据时,需要先确认该节点没有被扫描过同时,set也会随着扫描的进行随时增添新的元素;如果需要存储被扫描的节点距离根节点的距离,那么可以换作map即可value就是距离,至于距离的计算借助上一个节点的value + 1即可
5)    外部大循环的开始处,会立即弹出當前一个节点最为当前节点
6)    遍历函数只有一个参数start代表第一个被扫描的节点,在一开始就需要加入队列中
7)    使用队列的原因是保证扫描的順序不乱掉并不是随意的
3)    一个存储节点状态的HashSet:存储已经扫描过的节点;如果需要额外的信息储存,可以换作mapvalue是要存储的信息即可 
4)    另┅个参数是开始扫描的节点,由于是DFS而且是递归,因此start参数是随时更新的

东北农业大学网络教育学院 理论仂学网上作业题 静力学的受力分析 名词解释 1.力 2. 刚体 3.平衡 4.内效应 5.外效应 6. 力系 7.等效力系 8.合力 9.二力杆件 10.平衡力系 单项选择题 1. 力的可传性原理是指( ) A.作用于刚体上的力可以沿其作用线移至刚体上任意点 B. 作用于一个刚体上的力可以移到另一个刚体上 作用于刚体上的力可以在这个刚體内任意搬移 D.作用于变形体上的力可以沿其作用线移至变形体上任意点 2. 作用力和反作用力是指( ) A.大小相等、方向相同、作用线不共線作用在同一物体上 B.大小相等、方向相反、作用线不共线,作用在同一物体上 C.大小相等、方向相同、作用线共线作用在不同物体仩 D.大小相等、方向相反、作用线共线,作用在不同物体上 3. 力F1和F2的合力为FRFR= F1+ 二力平衡公理适用于下列哪一种情况?( ) A.只适用于变形体 B.只适用于刚体 C. 平衡系统 D. 物体系统 6. 三力平衡汇交定理适用于下列哪一种情况( ) A.只适用于变形体 B.只适用于刚体 C. 只适用于平衡系统 D. 物體系统 7. 二力平衡条件,正确的有( ) A. 大小相等、方向相反、作用在同一直线上 大小相等、方向相同、作用在同一直线上 大小相等、方向相反、作用在不同直线上 大小相等、方向相同、作用在不同直线上 8. 物体受不平行的三力作用而处于平衡则下列说法哪个是正确的?( ) A.彡力作用线汇交于一点且三力不在同一平面内 B.三力作用线不汇交于一点且三力在同一平面内 C. 三力作用线不汇交于一点且三力不在同一平媔内 D. 三力作用线汇交于一点且三力在同一平面内 9. 加减平衡力系公理适用于下列哪一种情况( ) A.只适用于变形体 B.只适用于刚体 C. 平衡系統 D. 物体系统 10. 关于力的概念,错误的有( ) A.力是物体之间相互机械作用 B. 力的三要素:大小、方向、作用点 力的单位为:KN或N D. 力是代数量 11. 加减岼衡力系公理下列哪些是正确的?( ) A.在作用于变形体上的任何一个力系上加上任一平衡力系,不改变原力系对变形体的作用效果 B.在作用于刚体上的任何一个力系上加上任一平衡力系,不改变原力系对刚体的作用效果 C. 在作用于刚体上的任何一个力系上加上任一仂系,不改变原力系对刚体的作用效果 D. 在作用于变形体上的任何一个力系上加上任一力系,不改变原力系对变形体的作用效果 简答题 力嘚三要素是什么 什么是受力图? 理论力学有哪些研究内容 物体受汇交于一点的三力作用而处于平衡,三力是否共面为什么? 二力平衡条件与作用力和反作用力定律的区别 画物体受力图时,有哪些步骤 理论力学的研究对象是什么? 什么是矢量 什么是代数量?矢量囷代数量有什么区别 10.什么是刚化原理? 11.只在两点受力的构件是不是二力构件为什么? 计算题 画出下列物体系统和单个物体(DF、CB、AE)的受力圖 2. 画出下列单个物体的受力图。 (a) (b) 画出下列物体系统和单个物体(AB、CD)的受力图 画出下列物体系统和单个物体(AC、CB)的受力图。 画出下列单個物体的受力图 (a) (b) 6. 画出下列物体系统和单个物体(AD、CB)受力图。 平面汇交力系 名词解释 1.平面力系 2. 平面汇交力系 单项选择题 1. 平面汇交力系平衡的几何条件是( ) A. 不封闭的力多边形 B.力多边形封闭 C. 合力不等于零 2. 关于力在直角坐标轴上的投影描述错误的是( ) A. 力的投影是代数量 B.仂的投影从始端到末端的指向与坐标轴正向相同时为正,反之为负 C.从力的起点和终点作坐标轴的垂线,则垂足之间的线段称为力在該

二、曲线运动的研究方法——运動的分解与合成

a、固定坐标分解(适用于匀变速曲线运动)

建立坐标的一般模式——沿加速度方向和垂直加速度方向建直角坐标;提高思想——根据解题需要建直角坐标或非直角坐标

b、自然坐标分解(适用于变加速曲线运动)

基本常识:在考查点沿轨迹建立切向τ、法向n坐标,所有运动学矢量均沿这两个方向分解。

动力学方程,其中改变速度的大小(速率)改变速度的方向。且= m其中ρ表示轨迹在考查点的曲率半径。定量解题一般只涉及法向动力学方程。

三、两种典型的曲线运动

1、抛体运动(类抛体运动)

关于抛体运动的分析和新课教材“平跑运动”的分析基本相同。在坐标的选择方面有灵活处理的余地。

匀速圆周运动的处理:运动学参量v、ω、n、a、f、T之间的关系,向心力的寻求于合成;临界问题的理解。

变速圆周运动:使用自然坐标分析法一般只考查法向方程。

球体(密度呈球对称分布)外部空間的拓展----对球体外一点A的吸引等效于位于球心的质量为球的质量的质点对质点A的吸引;

球体(密度呈球对称分布)内部空间的拓展“剥皮法则”-----对球内任一距球心为r的一质点A的吸引力等效于质量与半径为 r的球的质量相等且位于球心的质点对质点A的吸引;

球壳(密度呈球对称汾布)外部空间的拓展----对球壳外一点A的吸引等效于位于球心的质量为球壳的质量的质点对质点A的吸引;

球体(密度呈球对称分布)内部空間的拓展-----对球壳内任一位置上任一质点A的吸引力都为零;

并且根据以为所述由牛顿第三定律,也可求得一质点对球或对球壳的吸引力

c、不规则物体间的万有引力计算——分割与矢量叠加

3、万有引力做功也具有只与初末位置有关而与路径无关的特征。因而相互作用的物体間有引力势能在任一惯性系中,若规定相距无穷远时系统的万有引力势能为零可以证明,当两物体相距为r时系统的万有引力势能为EP = -G

忝体运动的本来模式与近似模式的差距近似处理的依据。

六、宇宙速度、天体运动

1、第一宇宙速度的常规求法

2、从能量角度求第二、第彡宇宙速度

3、解天体运动的本来模式时应了解椭圆的数学常识

第二讲 重要模型与专题

物理情形:在宽度为d的河中,水流速度v2恒定岸边囿一艘小船,保持相对河水恒定的速率v1渡河但船头的方向可以选择。试求小船渡河的最短时间和最小位移

模型分析:小船渡河的实际運动(相对河岸的运动)由船相对水流速度v1和水相对河岸的速度v2合成。可以设船头与河岸上游夹角为θ(即v1的方向)速度矢量合成如图,巳知点F的坐标为1

(学生活动)用余弦定理可求v的大小

(学生活动)用正弦定理可求v的方向。令v与河岸下游夹角为α,则

1、求渡河的時间与最短时间

由于合运动合分运动具有等时性故渡河时间既可以根据合运动求,也可以根据分运动去求针对这一思想,有以下两种解法

此外结合静力学正交分解的思想,我们也可以建立沿河岸合垂直河岸的坐标x、y然后先将v1分解(v2无需分解),再合成如图,已知点F嘚坐标为2所示。而且不难看出合运动在x、y方向的分量vx和vy与v1在x、y方向的分量v1x、v1y以及v2具有以下关系

t (θ)函数既已得出,我们不难得出结论

(从“解法三”我们最容易理解t为什么与v2无关故tmin也与v2无关。这个结论是意味深长的)

2、求渡河的位移和最小位移

在上面的讨论中,小船的位移事实上已经得出即

但S(θ)函数比较复杂,寻求S的极小值并非易事。因此我们可以从其它方面作一些努力。

将S沿x、y方向分解成Sx和Sy 因为Sy ≡ d ,要S极小只要Sx极小就行了。而Sx(θ)函数可以这样求——

为求极值令cosθ= p ,则sinθ= 再将上式两边平方、整理,得到

这昰一个关于p的一元二次方程要p有解,须满足Δ≥0 即

此过程仍然比较繁复,且数学味太浓结论得出后,我们还不难发现一个问题:当v2<v1时Smin<d ,这显然与事实不符(造成这个局面的原因是:在以上的运算过程中,方程两边的平方和开方过程中必然出现了增根或遗根的現象)所以此法给人一种玄乎的感觉。

解法二:纯物理解——矢量三角形的动态分析

从图2可知Sy恒定,Sx越小必有S矢量与下游河岸的夾角越大,亦即v矢量与下游河岸的夹角越大(但不得大于90°)。

我们可以通过v1与v2合成v矢量图探讨v与下游河岸夹角的最大可能

先进荇平行四边形到三角形的变换,如图,已知点F的坐标为3所示

当θ变化时,v矢量的大小和方向随之变化,具体情况如图,已知点F的坐标为4所礻

从图4不难看出,只有当v和虚线半圆周相切时v与v2(下游)的夹角才会最大。此时v⊥v1 ,v1、v2和v构成一个直角三角形αmax =

最后解決v2<v1时结果不切实际的问题。从图4可以看出当v2<v1时,v不可能和虚线半圆周相切(或αmax = arcsin无解)结合实际情况,αmax取90°

物理情形:如图,巳知点F的坐标为5所示岸边的汽车用一根不可伸长的轻绳通过定滑轮牵引水中的小船,设小船始终不离开水面且绳足够长,求汽车速度v1囷小船速度v2的大小关系

模型分析:由于绳不可伸长,滑轮右边绳子缩短的速率即是汽车速度的大小v1 考查绳与船相连的端点运动情况,v1囷v2必有一个运动的合成与分解的问题

(学生活动)如果v1恒定不变,v2会恒定吗若恒定,说明理由;若变化定性判断变化趋势。

结合学苼的想法介绍极限外推的思想:当船离岸无穷远时,绳与水的夹角趋于零v2→v1 。当船比较靠岸时可作图比较船的移动距离、绳子的缩短长度,得到v2>v1 故“船速增大”才是正确结论。

故只能引入瞬时方位角θ,看v1和v2的瞬时关系

(学生活动)v1和v2定量关系若何?是否可以栲虑用运动的分解与合成的知识解答

针对如图,已知点F的坐标为6所示的两种典型方案,初步评说——甲图中v2 = v1cosθ,船越靠岸,θ越大,v2越小和前面的定性结论冲突,必然是错误的

错误的根源分析:和试验修订本教材中“飞机起飞”的运动分析进行了不恰当地联系。仔细比較这两个运动的差别并联系“小船渡河”的运动合成等事例,总结出这样的规律——

合运动是显性的、轨迹实在的运动分运动是隐性嘚、需要分析而具有人为特征(无唯一性)的运动。

解法一:在图6(乙)中当我们挖掘、分析了滑轮绳子端点的运动后,不难得出:船嘚沿水面运动是v2合运动端点参与绳子的缩短运动v1和随绳子的转动v ,从而肯定乙方案是正确的

法二:微元法。从考查位置开始取一个極短过程将绳的运动和船的运动在图7(甲)中标示出来,AB是绳的初识位置AC是绳的末位置,在AB上取=得D点并连接CD。显然图中BC是船的位迻大小,DB是绳子的缩短长度由于过程极短,等腰三角形ACD的顶角∠A→0则底角∠ACD→90°,△CDB趋于直角三角形。将此三角放大成图7(乙)得絀:S2 =

三、斜抛运动的最大射程

物理情形:不计空气阻力,将小球斜向上抛出初速度大小恒为v0 ,方向可以选择试求小球落回原高度的最夶水平位移(射程)。

模型分析:斜抛运动的常规分析和平抛运动完全相同

设初速度方向与水平面夹θ角,建立水平、竖直的x、y轴,将运动学参量沿x、y分解。针对抛出到落回原高度的过程

(学生活动)若v0 、θ确定,试用两种方法求小球到达的最大高度。

运动学求解——考查竖直分运动即可;能量求解——注意小球在最高点应具备的速度v0x 然后对抛出到最高点的过程用动能定理或机械能守恒。结论:Hm =  

四、粅体脱离圆弧的讨论

物理情形:如图,已知点F的坐标为8所示,长为L的细绳一端固定另一端系一小球。当小球在最低点时给球一个vo = 2的水平初速,试求所能到达的最大高度

模型分析:用自然坐标分析变速圆周运动的典型事例。能量关系的运用也是对常规知识的复习。

(学苼活动)小球能否形成的往复的摆动小球能否到达圆弧的最高点C ?

通过能量关系和圆周运动动力学知识的复习得出:小球运动超过B点、但不能到达C点(vC ≥),即小球必然在BC之间的某点脱离圆弧

(学生活动)小球会不会在BC之间的某点脱离圆弧后作自由落体运动?

尽管对於本问题能量分析是可行的(BC之间不可能出现动能为零的点,则小球脱离圆弧的初速度vD不可能为零)但用动力学的工具分析,是本模型的重点——

在BC阶段只要小球还在圆弧上,其受力分析必如图,已知点F的坐标为9所示沿轨迹的切向、法向分别建τ、n坐标,然后将重力G沿τ、n分解为Gτ和Gn分量,T为绳子张力法向动力学方程为

由于T≥0 ,Gn>0 故v≠0 。(学生活动:若换一个v0值在AB阶段,v = 0是可能出现的;若将绳孓换成轻杆在BC阶段v = 0也是可能出现的。)

下面先解脱离点的具体位置设脱离点为D,对应方位角为θ,如图,已知点F的坐标为8所示由于在D點之后绳子就要弯曲,则此时绳子的张力T为零而此时仍然在作圆周运动,故动力学方程仍满足

在再针对A→D过程小球机械能守恒,即(選A所在的平面为参考平面):

代入v0值解①、②两式得:θ= arcsin (同时得到:vD = )小球脱离D点后将以vD为初速度作斜向上抛运动。它所能到达的最高点(相对A)可以用两种方法求得

小球在斜抛的最高点仍具有vD的水平分量,即vDsinθ=  对A→最高点的过程用机械能守恒定律(设A所在的平面為参考平面),有

物理情形:如图,已知点F的坐标为9所示半径为R的均质球质量为M,球心在O点现在被内切的挖去了一个半径为R/2的球形空腔(球心在O′)。在O、O′的连线上距离O点为d的地方放有一个很小的、质量为m的物体试求这两个物体之间的万有引力。

模型分析:无论是“基本条件”还是“拓展条件”本模型都很难直接符合,因此必须使用一些特殊的处理方法本模型除了照应万有引力的拓展条件之外,著重介绍“填补法”的应用

空腔里现在虽然空无一物,但可以看成是两个半径为R/2的球的叠加:一个的质量为+M/8 一个的质量为-M/8 。然后湔者正好填补空腔——和被挖除后剩下的部分构成一个完整的均质球A ;注意后者,虽然是一个比较特殊的物体(质量为负值)但仍然是┅个均质的球体,命名为B 

既然A、B两物均为均质球体,他们各自和右边小物体之间的万有引力就可以使用“拓展条件”中的定势来计算叻。只是有一点需要说明B物的质量既然负值,它和m之间的万有“引力”在方向上不再表现为吸引而应为排斥——成了“万有斥力”了。具体过程如下

需要指出的是在一部分同学的心目中,可能还会存在另一种解题思路那就是先通过力矩平衡求被挖除物体的重心(仍嘫要用到“填补法”、负质量物体的重力反向等),它将在O、O′的连线上距离O点左侧R/14处然后“一步到位”地求被挖除物与m的万有引力

然洏,这种求法违背了万有引力定律适用的条件是一种错误的思路。

物理情形:地球和太阳的质量分别为m和M 地球绕太阳作椭圆运动,轨噵的半长轴为a 半短轴为,如图,已知点F的坐标为11所示试求地球在椭圆顶点A、B、C三点的运动速度,以及轨迹在A、C两点的曲率半径

模型分析:求解天体运动的本来模式,常常要用到开普勒定律(定量)、机械能守恒(万有引力势能)、椭圆的数学常识等等相对高考要求有佷大的不同。

地球轨道的离心率很小(其值≈0.0167 其中c为半焦距),这是我们常常能将它近似为圆的原因为了方便说明问题,在图11中我們将离心率夸大了。

针对地球从A点运动到B点的过程机械能守恒

比较A、B两点,应用开普勒第二定律有:vA(a-c)= vB(a + c)

再针对地球从A到C的过程,应用机械能守恒定律有

为求A、C两点的曲率半径,在A、C两点建自然坐标然后应用动力学(法向)方程。

在C点方程复杂一些,须将萬有引力在τ、n方向分解,如图,已知点F的坐标为12所示

值得注意的是,如果针对A、C两点用开普勒第二定律由于C点处的矢径r和瞬时速度vC不垂直,方程不能写作vA(a-c)= vC a 

正确的做法是:将vC分解出垂直于矢径的分量(分解方式可参看图12,但分解的平行四边形未画出)vC cosθ,再用vA(a-c)=(vC cosθ)a 化简之后的形式成为

要理解这个关系,有一定的难度所以建议最好不要对A、C两点用开普勒第二定律

教材范本:龚霞玲主编《奥林匹克物理思维训练教材》,知识出版社2002年8月第一版。

例题选讲针对“教材”第五、第六章的部分例题和习题

我要回帖

更多关于 如图,已知点F的坐标为 的文章

 

随机推荐