抽象概念一定要被具象化才能被理解吗?

转载自 https://www.yueyao1982.com/phil_faq/faq_abstraction.html 若侵犯了内容创作者的权益,请联系删除 正文: 恰恰相反,具体的问题一定要抽象化之后才能理解,虽然这乍听起来比较奇怪。我们不妨想一想中学物理中最简单的问题,比如斜面上物体的运动。我们是先把物体和斜面都作了抽象化——物体和斜面都有很多细节,即“象”,而这些“象”被我们忽略了,或者说是抽离了,亦即“抽象”。所以,我们通过牛顿力学来理解机械运动,只是在理解抽象物体的相互关系,比如它们之间的作用,即力,比如它们之间的相对运动:简而言之,我们是在研究一个抽象模型,并试图理解这个模型。我们能做到最好的,就是我们的抽象化很合理,亦即被抽掉的“象”都是次要的;相应的,我们能得到最好的结果就是:模型的预测结果和实际的观测结果之间误差很小,一般来说不能没有误差,除非被观测值的可能性是离散甚至是有限的——比如电子的自旋只有两种可能。即使我们真的把主要因素抽掉,我们仍然可以理解那个被抽象出来的模型,只是那个模型和经验世界已经不能很好的对应了。 稍微深入一些来说,并非所有的抽象概念都能具象化,或者说概念的世界至少从规则和可能性这些方面来讲,并不受制于经验的世界,虽然没有经验概念就无从产生。比如我们观察过很多“经验中的马”,忽略了彼此不同的“象”,比如颜色、大小、公母等因素,就产生了“马的概念”;同样,我们观察过很多“经验世界中的鸟”,忽略了彼此不同的“象”,就产生了“鸟的概念”。“马的概念”和“鸟的概念”都可以被具象化到自然界中真实的动物。然而,我们的思维还可以对概念进行加工,比如我们对“鸟”概念进行切分,得到了“翅膀的概念”(当然它还是可以被具象化的)。然后我们把“翅膀的概念”和“马的概念”进行组合,得到了“天马”的概念——这个概念虽然可以具象化为具体的玩具或模型,但不再能具象化为自然界中的动物了。与此相似,我们还可以进行更复杂的概念建构,比如用更多的翅膀构建出“六翼天使”,比如用多种动物的不同部分构建出了“龙”和“麒麟”等神兽。当然,到此为止,这些概念至少还是可以被在一定程度上具象化,比如画成图画,比如做成雕刻。但是,更进一步的概念建构使这点也不可能了。如果我们把自然数的计数泛化到空间的维度上,我们就构建出了N维空间——1维空间、2维空间和3维空间是可以被具象化的,4维...

leetcode——16.3 sum clsest题解

 题目要求:

给出一个整型数组,寻找其中的3个元素a,b,c使得a+b+c的值最接近另外一个给定的数字target

   代码:


	class Solution {
public:
    int threeSumClosest(vector& nums, int target) {
        int n = nums.size();
        if (n < 3) return 0; // 处理数组长度不足三个的情况
        sort(nums.begin(), nums.end());
        int closestSum = nums[0] + nums[1] + nums[2]; // 初始化为前三个数的和
        int minDiff = abs(closestSum - target); // 记录当前最小差值
        for(int i = 0; i < n - 2; i++){
            int left = i + 1;
            int right = n - 1;
            while(left < right){
                int sum = nums[left] + nums[right] + nums[i];
                int diff = abs(sum - target);
                if(diff < minDiff) { // 更新最小差值和最接近目标值的和
                    minDiff = diff;
                    closestSum = sum;
                }
                if(sum < target) left++; // 和小于目标值,左指针右移
                else right--; // 和大于目标值,右指针左移
            }
        }
        return closestSum;
    }
};

	
	
	

这道题使用了对撞指针(left和right)同时还使用了另外一个指针i用以遍历数组



其中索引i移动一次时,right和left要在满足right>left的条件下一直对向移动。

    right和left移动的条件:

            代码中已经写明。

值得一提的是:left和right的单次移动是有条件的,并不是在一个判断语句下(即并不是left++后right一定--)。有一个判断语句判断是应该left++还是right--。

    对撞指针的前提:

    数组一定是有序的!!!!。
       如果数组没有顺序,则不能使用对撞指针。这是因为指针移动后要进行比较和下一次移动如果数组是有序的,则right--后nums【rihgt】+nums【left】的值一定是减小的。left++后,nums【right】+nums【left】一定是增加的。

     最初的判断条件:

nums.size() >=3(这是理所当然的)不要忘记设置断言(assert)和判断(if)来避免这种情况。
       


此博客中的热门博文

算法的八大常用思想